这是一道数论的题目,要想做出这题,只需要明白两点就行:
1)一个正整数n按素因子分解:n=p1^a1*p2^a2*....*pk^ak,那么n的约数的个数为(a1+1)(a2+1)...(ak+1);
2)对于一个素数p,n!中按素因子分解,p的幂为 n/p+n/p^2+n/p^3...,其中/为整除
随便说一下,这种方法速度很慢,时间900MS以上,由于本人水平有限,目前只能这样了,如果有人知道更好的代码的方法,希望告诉我一下。
代码(C++):
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int count(int n,int p)
{
int t=p,ans=0;
while(n>=t)
{
ans+=n/t;
t*=p;
}
return ans;
}
int main(int argc, char *argv[])
{
int n,k,len,i,j,prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,
67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,
167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,
271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,
389,397,401,409,419,421,431},c=83,tmp;
long long ans;
while(cin>>n>>k)
{
ans=1;
if(n==k||k==0)
{
cout<<ans<<endl;
continue;
}
for(i=0;i<c;i++)
{
if(prime[i]>n) break;
tmp=count(n,prime[i]);
tmp-=count(n-k,prime[i]);
tmp-=count(k,prime[i]);
ans*=(tmp+1);
}
cout<<ans<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
/*这是求素数的代码
#define MAX 432
bool isprime[MAX];
memset(isprime,true,sizeof(isprime));
len=sqrt(MAX*1.0);
for(i=2;i<=len;i++)
{
if(isprime[i])
{
for(j=i+i;j<MAX;j+=i) isprime[j]=false;
}
}
c=0;
for(i=2;i<MAX;i++)
{
if(isprime[i])
{
prime[c++]=i;
}
}
*/
题目:
Divisors
Time Limit: 1000MS | Memory Limit: 65536K | |
Description
Your task in this problem is to determine the number of divisors of
Cnk. Just for fun -- or do you need any special reason for such a useful computation?
Input
The input consists of several instances. Each instance consists of a single line containing two integers n and k (0 ≤ k ≤ n ≤ 431), separated by a single space.
Output
For each instance, output a line containing exactly one integer -- the number of distinct divisors of
Cnk. For the input instances, this number does not exceed 2
63 - 1.
Sample Input
5 1 6 3 10 4
Sample Output
2 6 16