Description
Johnny Q最心爱的女孩GJ被其情敌CK掳到了HFUT翡翠湖城堡,为了夺回自己的爱人,Johnny Q依然决定深入虎穴救出GJ。
现在,他来到了城堡的面前,很好没人发现他。可是城堡的大门是高科技产品,需要一个密码才能打开。Johnny Q曾听DJ说过CK是个酷爱数学的人,所以他用了一个很猥琐的密码: (X+Y)^N的展开式.这下Johnny Q囧了。不过幸好他的电话支持3G功能,于是他打视频电话向你求助,聪明的你能帮助他么?
Input
输入的第一行是一个整数T, 代表有T组测试数据.
接下来每行有个整数N,代表(X+Y)的次数(1<= N <= 30)
Output
输出(X+Y)^N的展开式.展开式中的一次项省略其次数,如(X+Y)^2展开后为X^2+2XY+Y^2,每项与’+’之间均无空格,仅在最后一项后有一个回车.
Sample Input
2
1
2
Sample Output
X+Y
X^2+2XY+Y^2
对于(x+y)^n,可以表示为:
求和 ki*x^i * y^(n-i)
这里:
ki表示第i项的系数,i的取值范围:0-n,并且有k0=kn=1, k1=k(n-1)=n,k2=k(n-2)
对于k(i,n),恒有:k(0,n)=k(n,n)=1, k(1, n)=k(n-1, n) = n, k(i, n)=k(i-1, n-1) + k(i, n-1)
特别的,
当n为基数时,k([n/2], n) = k({n/2}, n),且为最大
当n为偶数时,有k(n/2, n)最大,且k(n/2, n) = 2*k([(n-1)/2], n-1)
根据以上数学模型,写一个迭代函数,确定各项系数即可得到结果。
可以麻烦把迭代程序发给咱不,我逻辑思维很差 绕不过来啦 谢谢
写了个C#版的,你自己改成C++吧:
static void Main(string[] args) { BinomialTheorem(1); BinomialTheorem(2); BinomialTheorem(3); BinomialTheorem(4); BinomialTheorem(5); BinomialTheorem(6); Console.Read(); /* X+Y X^2+2XY+Y^2 X^3+3X^2Y+3XY^2+Y^3 X^4+4X^3Y+6X^2Y^2+4XY^3+Y^4 X^5+5X^4Y+10X^3Y^2+10X^2Y^3+5XY^4+Y^5 X^6+6X^5Y+15X^4Y^2+20X^3Y^3+15X^2Y^4+6XY^5+Y^6 */ } public static void BinomialTheorem(int n) { var index= GetIndex(n); n++; for (var j = 1; j < index.GetLength(1); j++) { if (index[n, j] != 0) { if (j == 1) { Console.Write("X" + (n - 1 > 1 ? "^" + (n - 1) : "")); } else if (j > 1 && index[n, j] == 1) { Console.Write("+Y" + (n - 1 > 1 ? "^" + (n - 1) : "")); } else { Console.Write("+" + index[n, j] + "X" + (n - j > 1 ? "^" + (n - j) : "") + "Y" + (j-1 > 1 ? "^" + (j-1) : "")); } } } Console.WriteLine(); } public static int[,] GetIndex(int n) { n = n + 2; int[,] arr = new int[n, n]; for (int i = 2; i < n; i++) { int j = i; for (int k = 1; k <= j; k++) { if (k == 1) { arr[j, k] = 1; } else if (k == j) { arr[j, k] = 1; } else { arr[j, k] = arr[j - 1, k - 1] + arr[j - 1, k]; } } } return arr; }
artwl感谢代劳了。