http://www.wutianqi.com/?p=596
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1028
代码:
#include#include int c1[130], c2[130]; int main() { int i, j, k; int n; while(scanf("%d", &n) != EOF) { // memset(c1, 1, (n + 1) * sizeof(int)); // memset(c2, 0, (n + 1) * sizeof(int)); //不能用memset这个函数是按字节赋值的,当给整型数组用这种方式清1的话, 不可行 for(i = 0; i <= n; i++) { c1[i] = 1; c2[i] = 0; // printf("c1[%d]=%d c2[%d] = %d\n", i, c1[i], i, c2[i]); } //代表表达式数量 ,例如输入2 //(1 + x + x ^ 2) * (1 + x ^ 2) i代表表达式数量 for(i = 2; i <= n; i++) { //这里代表两个表达式相乘,j表示项数第一个表达式的第i个数,k算指数,好相对应的对系数数组赋值 for(j = 0; j <= n; j++) { for(k = 0; k + j <= n; k += i) { c2[j + k] += c1[j]; } } //保存两个表达式相乘后变为一个表达式的系数,让c2清0 for(j = 0; j <=n; j++) { c1[j] = c2[j]; c2[j] = 0; } } printf("%d\n", c1[n]); } return 0; }