整数划分 poj3181

分析

因为n,m分别最大1000,100
所以结果会超过ll,要用两个来存大数的两部分

代码

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define ll long long
const ll inf=1e18;
ll a[1010][110],b[1010][110];
int main(){
	int n,k;
	//freopen("in.txt","r",stdin); 
	while(cin>>n>>k){
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(int i=0;i<=k;i++)
		a[0][i]=1;
		for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++)
		{
			if(i>j)
			{
				a[j][i]=a[j][i-1];
				b[j][i]=b[j][i-1];//因为前面的也有可能超过ll
			}
			else{
				a[j][i]=(a[j][i-1]+a[j-i][i])%inf;
				b[j][i]=b[j][i-1]+b[j-i][i]+(a[j][i-1]+a[j-i][i])/inf;
			}
		}
		if(b[n][k]) cout<<b[n][k];
		cout<<a[n][k]<<endl;
	}
	return 0;
}
posted @ 2019-03-29 16:24  ChunhaoMo  阅读(109)  评论(0)    收藏  举报