無數次轉的母函數

自己理解:對於(#式)  (1+x+x^2+x^3+x^4+x^5+....)*(1+x^2+x^4+x^6+x^8+x^10+....)*(1+x^3+x^6+x^9+x^12....).....

第一個for給c1 和 c2 賦值 , 把上面#式的第一個括號(1+x+x^2+x^3+x^4+x^5+....)的係數給放在c1中,

從而再次計算從 # 的 第二個括號開始 , 所以 i 就是代表的# 式第幾個括號,

而 用程序模擬手工計算 , 就是 先計算第一個括號 與 第二個括號 計算 , 把結果放到c2中,

在把結果與第三個括號計算 , 把結果放到c2中 , 在和第四個括號計算,........

所以j 就是指的 已經計算出 的 各項的係數 ,比如第一次之後 1+x+x^2+x^3+x^4+x^5+... , j=0指向1 ,

j=2 指向x , .... , 而 k 就是指 將要計算的那個括號中的項 , 因爲第i個括號 , 中的指數爲0 , i , 2i....所以 k要 + i ;

而結果 c2[j+k] += c1[j]; 就是把 以計算出的 j項的係數 和 現在正在計算的括號的k項相乘 , 所以指數爲j+k , 所以結果放到c2[j+k] 中 , 這就是這幾個for的作用!

最後刷新下結果 , 下一組數據計算!

c1[n]保存着Xn項前的係數,也就是n個(a1,...,an)組合數

點擊(此處)摺疊或打開

  1. /*//整數拆分模板
  2. #include <iostream>
  3. using namespace std;
  4. const int lmax=10000;
  5. //c1是用來存放展開式的係數的,而c2則是用來計算時保存的,
  6. //他是用下標來控制每一項的位置,比如 c2[3] 就是 x^3 的係數。
  7. //用c1保存,然後在計算時用c2來保存變化的值。
  8. int c1[lmax+1],c2[lmax+1];
  9. int main()
  10. {
  11.             int n, i, j, k ;
  12.            // 計算的方法還是模擬手動運算,一個括號一個括號的計算,
  13.            // 從前往後
  14.            while ( cin>>n )

  15.           {
  16.                      //對於 1+x+x^2+x^3+ 他們所有的係數都是 1
  17.                      // 而 c2全部被初始化爲0是因爲以後要用到 c2[i] += x ;
  18.                      for ( i=0; i<=n; i++ )

  19.                      {
  20.                                 c1[i]=1;
  21.                                 c2[i]=0;
  22.                      }
  23.                       //第一層循環是一共有 n 個小括號,而剛纔已經算過一個了
  24.                       //所以是從2 到 n
  25.                      for (i=2; i<=n; i++)

  26.                    {
  27.                                  // 第二層循環是把每一個小括號裏面的每一項,都要與前一個
  28.                                  //小括號裏面的每一項計算。
  29.                                 for ( j=0; j<=n; j++ )
  30.                                  //第三層小括號是要控制每一項裏面 X 增加的比例
  31.                                  // 這就是爲什麼要用 k+= i ;
  32.                                          for ( k=0; k+j<=n; k+=i )

  33.                                         {
  34.                                                  // 合併同類項,他們的係數要加在一起,所以是加法,呵呵。
  35.                                                  // 剛開始看的時候就卡在這裏了。
  36.                                                  c2[ j+k] += c1[ j];
  37.                                          }
  38.                                // 刷新一下數據,繼續下一次計算,就是下一個括號裏面的每一項。
  39.                               for ( j=0; j<=n; j++ )

  40.                               {
  41.                                           c1[j] = c2[j] ;
  42.                                           c2[j] = 0 ;
  43.                               }
  44.                    }
  45.                     cout<<c1[n]<<endl;
  46.         }
  47.          return 0;
  48. }
  49. 這句 c2[j+k] += c1[j];的理解還要自己好好的體會體會啊!
  50. */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章