这是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; }