整数划分 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;
}
上一篇:全面理解JavaScript中的闭包的含义及用法


下一篇:Spring框架--AOP编程