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