POJ2992 Divisors

题意:输入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\n", an[n][k]);
    }

    return 0;
}

 

posted on 2017-07-24 14:58  2855669158  阅读(128)  评论(0编辑  收藏  举报

导航