hdu 1398 整数划分变形 (母函数)

时间:2023-03-08 19:01:03
hdu 1398 整数划分变形 (母函数)

有1,4,9,16,25.....2^17这么多面值的硬币,问任意给定一个不大于300的正整数面额,用这些硬币来组成此面额总共有多少种组合种数

比如10
全1
4 + 6个 1
4+4+1+1
9+1

求(1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10)(1+x^4+x^8)(1+x^9)中
x^10的系数即可

只是把模板的 i<=n改成了i*i<=n,
在k遍历指数时把k=k+i变成了k=k+i*i

Sample Input
2
10
30
0

Sample Output
1
4
27

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <string>
# include <cmath>
# include <queue>
# include <list>
# define LL long long
using namespace std ; int c1[], c2[] ;
int main()
{
//freopen("in.txt","r",stdin) ;
int n;
int i, j, k;
while(cin >> n)
{
if (n == )
break ;
for(i=; i<=n; ++i)
{
c1[i] = ;
c2[i] = ;
}
for(i=; i*i<=n; ++i)
{ for(j=; j<=n; ++j)
for(k=; k+j<=n; k += i*i)
{
c2[j+k] += c1[j];
}
for(j=; j<=n; ++j)
{
c1[j] = c2[j];
c2[j] = ;
}
}
cout << c1[n] << endl;
}
return ;
}