{{{ #!cplusplus /* SUN 杭电1028 方法生成函数(1 + x + x^2 + x^3 + ……)*(1 + x^2 + x^4 + ……)*(1 + x^3 + x^6)……(1 + x^n) 求出x^n前面的系数 */ #include #define N 8000 using namespace std; int n; int a[N],b[N],ab[N];//数组a表示一个多项式的系数,下标表示指数 ab表示a和b 乘积 int Num() { int i,j,k; memset(ab, 0 ,sizeof(ab)); for(i = 0; i <= n ; i++) ab[i] = 1;//第一次要赋值为全1,为下面循环准备 for(k = 2; k <= n; k++) { memcpy(b, ab, sizeof(ab));//把ab 复制给 b 开始新的循环 for(i = 0; i <= n; i++) { a[i] = 0; ab[i] = 0; } //初始化数组a 和 ab。也可以试试memset函数我被超时吓怕了 for(i = 0; i <= n; i += k) a[i] = 1;//新的一个多项式 for(i = 0; i <= n; i++)// 两个多项式相乘 for(j = 0; j <= n; j++) { ab[i+j] += a[i]*b[j]; if(i + j > n)// 为了不做无谓的操作 break; } } return ab[n];//指数是n的项的系数就是结果 } int main() { int res; while(scanf("%d",&n) != EOF) { res = Num(); printf("%d\n",res); } return 0; } }}}