• 母函数


    记录点滴。

      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 }
  • 相关阅读:
    主机访问虚拟机网络服务失败
    关于接收者为指针的方法
    slice的部分说明
    ES基础知识
    静态语言和动态语言
    数据库设计三大范式
    SparkSQL小例子
    spark小例子
    spark 分析作者发布文章的总阅读量
    spark和hadoop差异
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4574767.html
Copyright © 2020-2023  润新知