POJ2992 组合数的约束的个数 xingxing在努力
刚开始直接求, 结果TLE了n次, 最后发现要预处理,便预处理了n的阶乘, 代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> using namespace std; const int maxn = 500 + 10; int vis[maxn], prime[maxn], num; void shai(int n) { memset(vis, 0, sizeof(vis)); int m = sqrt(n+0.5); for(int i=2; i<=m; i++) if(!vis[i]) for(int j=i*i; j<=n; j+=i) vis[j] = 1; num = 0; for(int i=2; i<=n; i++) if(vis[i]==0) prime[num++] = i; } int jie[456][456]; void yu() { for(int i=1; i<=450; i++) { int n = i; //预处理n的阶乘 for(int j=0; j<num; j++) { jie[i][j] = jie[i-1][j]; while(n%prime[j] == 0) { jie[i][j] += 1; n /= prime[j]; } } } } int main() { shai(456); yu(); int n, m; while(scanf("%d%d", &n, &m)==2) { unsigned long long res = 1; for(int j=0; j<num; j++) { res *= (jie[n][j]-jie[m][j]-jie[n-m][j]+1); //printf("%d\n", jie[n][j]-jie[m][j]-jie[n-m][j]+1); } printf("%lld\n",res); } return 0; }

浙公网安备 33010602011771号