母函数

记录点滴。

  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 }

 

posted @ 2015-06-14 11:01  ht-beyond  阅读(187)  评论(0编辑  收藏  举报