poj 2992

http://poj.org/problem?id=2992

大意:求(n,k)的因子个数

解题思路:(n,k) = n!/(k!(n-k)!) 

任意一个数都可以用其质因子来表示  eg: 26 = 2^1 * 13^1; 240 = 2^4 * 3 *5;

即 x = p1^q1 * p2^2 *p3*q3 ....... 其因子的个数为(q1+1)*(q2+1)*(q3+1)。。。。

所以把 n! , k!, (n-k)! 中的公共因子删去,就得到的 (n,k)的结果

 #include <iostream>
#include<math.h>
using namespace std;
long long res[][];
int prime[];
void get_prime(){
// cout<<"---------->"<<endl;
int m = (int)sqrt(+0.5);
prime[] = prime[] =;
for(int i=;i<=m;i++){
if(!prime[i]){
// cout<<i<<endl;
for(int j=i*i;j<=;j+=i)
prime[j] =;
}
} } void solve(){ int i,j,n;
for(int i=;i<=;i++){//到i的阶乘为止,其所有质因子的个数
for(int j=;j<i;j++)
res[i][j] = res[i-][j];//只需再求i即可,,前面的一样。。
n =i;
for(j=;j<=&&n>;j++){
if(!prime[j]){
while(n%j==){//注意是%j 而不是%prime[j]。。
res[i][j]++;
n = n/j;
}
}
}
if(n>)
res[i][n]++;
}
}
int main()
{
get_prime();
solve();
/*for(int i=1;i<=10;i++)
if(!prime[i])
cout<<i<<endl;*/
int n,k;
while(cin>>n>>k){
long long sum =;
for(int i=;i<=n;i++)
if(!prime[i])
sum *=(res[n][i]-res[k][i]-res[n-k][i]+);//不要忘记+1.
cout<<sum<<endl;
}
return ;
}
上一篇:asp.net 获取系统的根目录


下一篇:Toast工具类,Android中不用再每次都写烦人的Toast了