| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
把每个分子分母分解质因数也可以0ms过先将1~100的素数打表,然后把每个分子分母分解质因数,记录下分子因数分解的情况,分子质因数表加到一起,分母的表加到一起,最后把分子的质因数表减去分母的质因数表,然后结果就好球了。。
#include<iostream>
#include<cmath>
using namespace std;
int prime[50];
void find()/*打50个素数表*/
{
prime[0]=2;
int i,j=1,n=3;
while(j<50)
{
for(i=0;prime[i]*prime[i]<=n;i++)
if(n%prime[i]==0)
break;
if(prime[i]*prime[i]>n)
prime[j++]=n;
n++;
}
}
int main()
{
find();
int i,j,m,n;
while(cin>>m>>n&&(m||n))
{
/*下面lockz[50]是分子的质因数表,lockm[50]是分母的*/
int fenzi,fenmu,lockz[50]={0},lockm[50]={0},nc=n;
if(n>m/2) n=m-n;
if(m!=0)
{
for(i=1;i<=n;i++)
{
fenzi=m-i+1;
fenmu=i;
for(j=0;prime[j]<=fenzi;j++)
if(fenzi%prime[j]==0)
{ lockz[j]++; fenzi/=prime[j--]; }
for(j=0;prime[j]<=fenmu;j++)
if(fenmu%prime[j]==0)
{ lockm[j]++; fenmu/=prime[j--]; }
}
}
__int64 o=1;
for(i=0;i<50;i++)
lockz[i]-=lockm[i];
for(i=0;i<50;i++)
if(lockz[i]) o*=int(pow(double(prime[i]),double(lockz[i])));
printf("%d things taken %d at a time is %I64d exactly.\n",m,nc,o);
}
return 0;
}
比如求C(3)(5)
可以化简为5/1*4/2
对于5/1 分子可以分解为1*5,所以质因数表是0 0 1 0.........0(可以分解为一个5)
对于4/2分子可以分解为2*2,所以质因数表是 2 0 .......0(可以分解为两个2)
加到一起是2 0 1 0.....0
同理分母分别为0 0 .......0和1 0.....0。 加到一起是1 0 0.....0
分子的质因数表减去分母的就是
1 0 1 0 ......0
所以最后的结果是2^1*5^1=10
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator