这个题我也不明白。但是学到了用两个数模拟大数的思想。想到大数,我第一个想到的肯定是用数组模拟,想不到这个。但其实我应该想得到的,因为汇编上两数相乘,高半部分和低半部分就保存再两个寄存器中,这个和汇编差不多。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL dp1[1005],dp2[1005],mod;
int N,K;
int main()
{
scanf("%d%d",&N,&K);
mod=1;
for(int i=1;i<=18;i++)mod*=10;
dp2[0]=1LL;
for(int i=1;i<=K;i++)
for(int j=i;j<=N;j++)
{
dp1[j]+=dp1[j-i]+(dp2[j]+dp2[j-i])/mod;
dp2[j]=(dp2[j]+dp2[j-i])%mod;
}
if(dp1[N])cout<<dp1[N];
cout<<dp2[N];
return 0;
}