母函数
记录点滴。
1 /* 2 2015.6 HT 3 ACM Work10 4 5 */ 6 7 #include <iostream> 8 #include <cstdio> 9 #include<cstring> 10 using namespace std; 11 12 /* 13 Ignatius and the Princess III 14 15 For example, assume N is 4, we can find: 16 4 = 4; 17 4 = 3 + 1; 18 4 = 2 + 2; 19 4 = 2 + 1 + 1; 20 4 = 1 + 1 + 1 + 1; 21 so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. 22 23 本题母函数:G(x)=(1+x+x2+x3+x4+…)(1+x2+x4+x8+…)(1+x3+x6+x9+…)… 24 25 从第一个括号开始算起,先把第一个括号跟第二个括号相乘,然后这两个括号就合并了,然后又把第一个括号跟第二个括号相乘, 26 直到n个括号全部被算出来 (i就代表第几个括号正在被合并) 27 28 m2[j + k] += m1[j] 29 j 代表大括号中的第j项,而k就代表大括号后面那个括号中的第k项 (也可把k叫做第i个括号中的第k项) 30 31 k = k + i 32 因为大括号后面那个括号中每两项之间相差x^i,所以k每次都要加i,这样大括号中第j项乘的就全是后面那个括号中的 33 34 m2[j + k] 35 第j项,第k项相乘后就得到第j+k项 36 */ 37 38 //// m1[i]记录第i个x次方数的系数 m2[] temp 39 //int m1[256], m2[256]; 40 // 41 //void GF(int n) 42 //{ 43 // for (int i = 0; i <= n; ++i) 44 // { 45 // m1[i] = 1; 46 // m2[i] = 0; 47 // } 48 // 49 // // 总共有n个括号,从第2个起每一个括号都要和前面那一个括号相乘 50 // for (int i = 2; i <= n; ++i) 51 // { 52 53 // // j代表最前面这个大括号的项数 54 // for (int j = 0; j <= n; ++j) 55 // // k+j <= n 根据题意求得x^n项前即可 56 // for (int k = 0; k + j <= n; k += i) 57 // m2[j + k] += m1[j]; 58 // 59 // for (int j = 0; j <= n; ++j) 60 // { 61 // m1[j] = m2[j]; 62 // m2[j] = 0; 63 // } 64 // } 65 //} 66 // 67 //int main() 68 //{ 69 // int n; 70 // while (scanf_s("%d", &n) != EOF) 71 // { 72 // GF(n); 73 // cout << m1[n] << endl; 74 // } 75 // return 0; 76 //} 77 78 79 80 /* 81 Square Coins 82 83 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins 84 本题母函数:G(x)=(1+x+x2+x3+x4+…)(1+x4+x8+x12+…)(1+x9+x18+x27+…)… 85 */ 86 // m1[i]记录第i个x次方数的系数 m2[] temp 87 int m1[302], m2[302]; 88 89 void GF(int n) 90 { 91 for (int i = 0; i <= n; ++i) 92 { 93 m1[i] = 1; 94 m2[i] = 0; 95 } 96 97 // 17^2 = 289 改为 i < 17 也可以 98 for (int i = 2; i <= 17; ++i) 99 { 100 for (int j = 0; j <= n; ++j) 101 for (int k = 0; k + j <= n; k += i*i) 102 m2[j + k] += m1[j]; 103 104 for (int j = 0; j <= n; ++j) 105 { 106 m1[j] = m2[j]; 107 m2[j] = 0; 108 } 109 } 110 } 111 112 int main() 113 { 114 int n; 115 while (scanf_s("%d", &n) != EOF) 116 { 117 if (n == 0) 118 break; 119 GF(n); 120 cout << m1[n] << endl; 121 } 122 return 0; 123 }