HDOJ1261排列组合+大数乘除

http://acm.hdu.edu.cn/showproblem.php?pid=1261

HDOJ1261排列组合+大数乘除_第1张图片

 

题解

  1. 令sum=a1+a2+···+an
  2. 种数为 sum!/(a1!a2!···an!)
  3. 其中sum最大为25*12,而int能容纳的最大阶乘为12,long long能容纳的最大阶乘不超过50,故这是一个大数乘法的问题。https://blog.csdn.net/wang_1997/article/details/68241892
    /////a*b=res
    //a,res均从前往后为个,十,百... 
    void multiply(vector a,long long b,vector& res,int& k)
    {
    	int p=0;
    	int cnt=k;
    	vector tmp(5000,0);
    	while(b)
    	{
    		int digit=b%10;
    		for(int i=0;icnt)
    				cnt=p+i+1;
    		}
    		p++;
    		b/=10;
    	}
    	
    	
    	k=cnt;
    	for(int i=0;i
  4. 由于sum!可能为大数,故又涉及到大数除法的问题。https://blog.csdn.net/z_y1314/article/details/79716387
    void divide(vector a,long long b,vector& res,int& k)
    {
    	vector tmp(5000,0);
    	long long rest=0;
    	int ind=0;
    	for(int i=0;i=b)
    		{
    			tmp[ind++]=rest/b;
    			rest=rest%b;
    		}
    	}
    	res=tmp;
    	k=ind;
    }

AC代码

#include
using namespace std;
#include
#include
#define N 250

vector jc(13);

void init()
{
	jc[0]=1;
	jc[1]=1;
	for(int i=2;i<13;i++)
		jc[i]=jc[i-1]*i;
}

/////a*b=res
//a,res均从前往后为个,十,百... 
void multiply(vector a,long long b,vector& res,int& k)
{
	int p=0;
	int cnt=k;
	vector tmp(5000,0);
	while(b)
	{
		int digit=b%10;
		for(int i=0;icnt)
				cnt=p+i+1;
		}
		p++;
		b/=10;
	}
	
	
	k=cnt;
	for(int i=0;i a,long long b,vector& res,int& k)
{
	vector tmp(5000,0);
	long long rest=0;
	int ind=0;
	for(int i=0;i=b)
		{
			tmp[ind++]=rest/b;
			rest=rest%b;
		}
	}
	res=tmp;
	k=ind;
}



int main()
{
	int n;
	init();
	while(cin>>n&&n)
	{
		vector a(n);
		int sum=0;
		for(int i=0;i>a[i];
			sum+=a[i];	
		}
		vector up(5000,0);
		int k=0;
		if(sum<=12)
		{
			long long tmp=jc[sum];
			for(int i=0;i

 

你可能感兴趣的:(ACM)