题意:输入n,k(-1<k<n<432)计算C(n,k)的因子个数
题解:一个数n唯一分解定理p =p1^a1+p2^a2+....因子个数为f(n) = (a1+1)*(a2+1)*(a3+1)...答案就是f(n)-f(k)-f(n-k),注意预处理
#include <iostream> #include <string.h> #include <stdio.h> #define N 1010 #define ll long long using namespace std; bool isprime[N]; int prime[N], num; long long an[N][N]; void doprime(int n){ int i,j; num = 0; memset(isprime, true,sizeof(isprime)); isprime[1] = 0; for(i=2;i<=n;i++){ if(isprime[i]){ prime[num++] = i; for(j=i*i;j<=n;j+=i) isprime[j] = false; } } } inline int f(int n,int k){ int t = k, ans=0; while(t<=n){ ans += n/t; t *= k; } return ans; } int main(){ int n,k; doprime(500); for(int i=0;i<=431;i++) for(int j=0;j<=i;j++){ an[i][j] = 1; for(int k=0;k<num;k++) an[i][j] *= (f(i,prime[k])-f(j,prime[k])-f(i-j, prime[k])+1); } while(~scanf("%d%d", &n, &k)){ printf("%lld ", an[n][k]); } return 0; }