自己理解:對於(#式) (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)組合數
點擊(此處)摺疊或打開
- /*//整數拆分模板
- #include <iostream>
- using namespace std;
- const int lmax=10000;
- //c1是用來存放展開式的係數的,而c2則是用來計算時保存的,
- //他是用下標來控制每一項的位置,比如 c2[3] 就是 x^3 的係數。
- //用c1保存,然後在計算時用c2來保存變化的值。
- int c1[lmax+1],c2[lmax+1];
- int main()
- {
- int n, i, j, k
;
- // 計算的方法還是模擬手動運算,一個括號一個括號的計算,
- // 從前往後
- while
( cin>>n
)
- {
- //對於 1+x+x^2+x^3+ 他們所有的係數都是
1
- // 而 c2全部被初始化爲0是因爲以後要用到 c2[i]
+= x
;
- for
( i=0; i<=n; i++
)
- {
- c1[i]=1;
- c2[i]=0;
- }
- //第一層循環是一共有 n 個小括號,而剛纔已經算過一個了
- //所以是從2 到 n
- for
(i=2; i<=n; i++)
- {
- // 第二層循環是把每一個小括號裏面的每一項,都要與前一個
- //小括號裏面的每一項計算。
- for
( j=0; j<=n; j++
)
- //第三層小括號是要控制每一項裏面 X 增加的比例
- // 這就是爲什麼要用 k+= i
;
- for
( k=0; k+j<=n;
k+=i
)
- {
- // 合併同類項,他們的係數要加在一起,所以是加法,呵呵。
- // 剛開始看的時候就卡在這裏了。
- c2[ j+k]
+= c1[ j];
- }
- // 刷新一下數據,繼續下一次計算,就是下一個括號裏面的每一項。
- for
( j=0; j<=n; j++
)
- {
- c1[j]
= c2[j]
;
- c2[j]
= 0 ;
- }
- }
- cout<<c1[n]<<endl;
- }
- return 0;
- }
- 這句 c2[j+k]
+= c1[j];的理解還要自己好好的體會體會啊!
- */