登 录
题目大意:求C(m)(n),输出结果的二进制不超过32位。。
思路:先将1~100的素数打表,然后把每个分子分母分解质因数,记录下分子因数分解的情况,分子质因数表加到一起,分母的表加到一起,最后把分子的质因数表减去分母的质因数表,然后结果就好球了。。
#include<iostream> #include<cmath> using namespace std; int prime[50]; void find() { 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)) { 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; }
抱歉!评论已关闭.