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;
}

 

posted @ 2015-11-12 23:55  xing-xing  阅读(148)  评论(0)    收藏  举报