洛谷 P1313 计算系数
题目描述
给定一个多项式 (by+ax)k,请求出多项式展开后 xn * ym 项的系数。
输入输出格式
输入格式:
共一行,包含 55 个整数,分别为 a ,b ,k ,n ,ma,b,k,n,m ,每两个整数之间用一个空格隔开。
输出格式:
共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 1000710007 取模后的结果。
输入输出样例
说明
【数据范围】
对于 30\%30% 的数据,有 0 ≤k ≤100≤k≤10 ;
对于 50\%50% 的数据,有 a = 1,b = 1a=1,b=1 ;
对于 100\%100% 的数据,有 0≤k ≤1,000,0≤n, m≤k0≤k≤1,000,0≤n,m≤k ,且 n+m=k ,0 ≤a,b ≤1,000,000n+m=k,0≤a,b≤1,000,000 。
思路:要求 xn * ym 的系数,必然要计算 (by+ax)k 中每一项的系数
那么问题来了,怎么求呢??
我们可以列几个式子来找找规律
当 a = b = 1 时:
k = 0, (x + y)k = 1
k = 1, (x + y)1 = x + y 各项系数为 1 1
k = 2, (x + y)2 = x2 + 2xy + y2 各项系数为 1 2 1
k = 3, (x + y)3 = x3 + 3x2y + 3xy2 + y3 各项系数为 1 3 3 1
以此类推,我们可以发现:当 a = b = 1 时,各项系数满足“杨辉三角的分布规律”,由此可以得出:f [ i ][ j ] = f [ i-1 ][ j-1 ] + f [ i -1 ][ j ]
这时候有的小盆友就要问了:那 a 和 b 不等于1时怎么算呢??
不知道大家有没有发现,上面的式子退出来后,是按 x 降幂排列的,也就是说每一项的 x 的指数是 k , k-1, k-2, ... 1, 0,而 y 的指数刚好相反
所以我们可以按照 y 的指数来寻找 xn * ym 的系数是“杨辉三角”中当前行的第几个数字
而后用这个数去乘 an * bm,取余后即为题目中所要求的系数
#include<algorithm> #include<iostream> #include<cstdio> #define Mod 10007 #define LL long long using namespace std; int a, b, k, n, m; LL f[1005][1005]; LL pow(LL x, LL y) { //快速幂求x^y int res = 1; while(y) { if(y & 1) res = res * x % Mod; x = x % Mod; x = (x * x) % Mod; y >>= 1; } return res; } int main() { cin >> a >> b >> k >> n >> m; a %= Mod; b %= Mod; f[0][0] = 1; f[1][0] = 1; f[1][1] = 1; for(int i = 2; i <= k; i++) { f[i][0] = 1; for(int j = 1; j <= i; j++) f[i][j] = (f[i-1][j-1] + f[i-1][j]) % Mod; } int x = pow(a, n), y = pow(b, m); long long ans = f[k][m] * x * y % Mod; printf("%lld\n", ans); return 0; }