自己理解:對於(#式) (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];的理解還要自己好好的體會體會啊!
- */