题意:
无数个1~n,问你构成n有多少种方法
题解:
按照以往应该往DP方向去想,但是这是母函数的场。
我们可以直接构造出函数然后O(1)查询
∏
i
=
1
n
(
1
+
i
i
+
i
2
i
+
.
.
.
)
\prod\limits_{i=1}^{n}(1+i^{i}+i^{2i}+...)
i=1∏n(1+ii+i2i+...)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=125;
ll dp[2][N];
int a[N];
int main()
{
int n=120;
for(int i=1;i<=n;i++)a[i]=120;
int f=0;
memset(dp[f],0,sizeof(dp[f]));
dp[f][0]=1;
int top=0;
for(int i=1;i<N;i++){
int nt=min(top+a[i]*i,N-1);
memset(dp[f^1],0,sizeof(ll)*(nt+1));
for(int j=0;j*i<=nt&&j<=a[i];j++)
for(int k=0;k<=top&&k+j*i<=nt;k++)
dp[f^1][k+j*i]+=dp[f][k];
f^=1;
top=nt;
}
while(~scanf("%d",&n)){
printf("%lld\n",dp[f][n]);
}
return 0;
}