Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

把每个分子分母分解质因数也可以0ms过

Posted by 317358117 at 2010-07-25 13:24:15 on Problem 1306 and last updated at 2010-07-25 13:38:15
先将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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator