P1313计算系数

这是2011年提高组第一题,一个数论题。如果当年我去的话,就爆零了wuwuwu.

题目:(ax+by)^k中询问x^m*y^n这一项的系数是多少?拿到题我就楞了,首先便是想到DP,二维分别存次数代表系数,然后转移方程无法构造。又去推导公式,只推导了一个就放弃了,爆零......其实多推导几组后发现这个题的系数是杨辉三角,然后可以得出tpl[i][j]=tpl[i-1][j]+tpl[i-1][j-1](a=b=1),但是当a!=b!=1时,杨辉三角则变成了下方的形式,可以得出新的方程tpl[i][j]=tpl[i-1][j]*a+ tpl[i-1][j-1]*b 。 那么最后输出tpl[k+1][m+1]即可

  1        1(按照x的次数排)

 1 1                         2 3

1 2 1                      4 12 9 

1 3 3 1               8 36 54 27

1 4 6 4 1

1.见到数论题,注意手推公式,以后至少三组

2.仔细审数据范围和数据特征,50%a=b=1,竟然没看到。还有就是m+n=k

3.遍历的时候注意i从哪里开始,从哪里结束,嵌套的范围是怎样的 

eg.初始i=1,j=1为1.那么i从第二行开始第k+1行结束;j从第一个开始,然后每一行的个数都等于行数,所以j<=i;

4.好好学数学,静下心来,有些浮躁

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int tpl[1005][1005];
long long a,b,k,n,m;
int main(){
    cin>>a>>b>>k>>n>>m;
    tpl[1][1]=1;
    for(int i=2;i<=k+1;i++){//i行j列   
        for(int j=1;j<=i;j++){
            tpl[i][j]=(tpl[i-1][j]*a+tpl[i-1][j-1]*b)%10007;
        }
    }
    cout<<tpl[k+1][m+1];//在第k+1行,m+1(y的系数) 
    return 0;
}

 

posted @ 2019-08-06 09:51  毛炯人  阅读(166)  评论(0编辑  收藏  举报