poj 2992
自己写个死活都TLE。。。。看的别人的才过。
任意一个数都可以分解为
n=p1^e1*p2^e2*...*pn^en,,,,
其中p1,,p2,,pn为素数,,,,,
则n的约数的个数为(e1+1)*(e2+1)*...*(en+1),,,,
利用筛法,,我们可以求出1~n中每个数的所有素约数的指数,,,,,
C(n,k)=n!/k!/(n-k)!,,,,,,
over,,,,
//============================================================================ // Name : 2992.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int e[432][432], sum[432][432]; bool prime[432]; int num, n, k; long long ans; int main(){ freopen("a.txt", "r", stdin); for(int i = 2;i < 432;i++){ if(!prime[i]){ ++num; e[i][num]++; for(int j = i<<1;j < 432;j+=i){ prime[j] = true; e[j][num] = e[j/i][num]+1; } } } for(int i = 1;i < 432;i++){ for(int k = 1;k <= num;k++){ sum[i][k] = sum[i-1][k]+e[i][k]; } } while(scanf("%d%d", &n, &k)!=EOF){ ans = 1; for(int i = 1;i <= num;i++){ ans = ans*(sum[n][i] - sum[k][i] - sum[n-k][i]+1); } printf("%I64d\n", ans); } return 0; }