标签:
题目类似于整数拆分,很明显用母函数来做。
母函数的写法基本固定,根据具体每项乘式的不同做出一些修改就行了。它的思路是从第一个括号开始,一个括号一个括号的乘开,用c1数组保存之前已经乘开的系数,即c1[j]表示在之前已经乘开过的那些括号处理后x的j次方的系数,c2数组是一个临时更新的统计数组,每处理一个括号就更新一遍c1数组即可。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<stack> #include<queue> #include<cctype> #include<sstream> using namespace std; #define pii pair<int,int> #define LL long long int const double eps=1e-10; const int INF=1000000000; const int maxn=300+10; int c1[maxn],c2[maxn],n; int main() { //freopen("in1.txt","r",stdin); //freopen("out.txt","w",stdout); for(int i=0;i<maxn;i++) { c1[i]=1; c2[i]=0; }//第一个括号已处理好 for(int i=2;i<=17;i++)//顺次乘进后面的每个括号 { for(int j=0;j<maxn;j++)//c1之前存储的每个j的值 { for(int k=0;k+j<maxn;k+=i*i)//本括号内的指数 { c2[k+j]+=c1[j]; } } for(int j=0;j<maxn;j++)//更新存储的值 { c1[j]=c2[j]; c2[j]=0; } } while(scanf("%d",&n)==1&&n) { printf("%d\n",c1[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zywscq/p/4275221.html