洛谷 P1313 计算系数

      洛谷 P1313 计算系数

题目描述

给定一个多项式 (by+ax)k,请求出多项式展开后 x* ym 项的系数。

输入输出格式

输入格式:

共一行,包含 55 个整数,分别为 a ,b ,k ,n ,ma,b,k,n,m ,每两个整数之间用一个空格隔开。

输出格式:

共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 1000710007 取模后的结果。

输入输出样例

输入样例#1: 复制
1 1 3 1 2
输出样例#1: 复制
3

说明

【数据范围】

对于 30\%30% 的数据,有 0 ≤k ≤100k10 ;

对于 50\%50% 的数据,有 a = 1,b = 1a=1,b=1 ;

对于 100\%100% 的数据,有 0≤k ≤1,000,0≤n, m≤k0k1,000,0n,mk ,且 n+m=k ,0 ≤a,b ≤1,000,000n+m=k,0a,b1,000,000 。

思路:要求 x* 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 的指数来寻找 x* 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;
}
View Code

 

posted @ 2018-07-15 21:02  落云小师妹  阅读(301)  评论(0编辑  收藏  举报