NOIP-2011-Day2-1 NKOJ 1327 计算系数
由于这是一道模板题 故记录一下
问题描述:
给定一个多项式 (ax+by)k,请求出多项式展开后次方 项的系数。
输入格式:
共一行,包含5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。
输出格式:
输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
样例输入 (1)
1 1 3 1 2
样例输出 (1)
3
样例输入 (2)
1234 5678 800 300 500
样例输出 (2)
9130
提示
【数据范围】
对于30%的数据,有0≤k≤10;
对于50%的数据,有a = 1,b = 1 ;
对于100%的数据,有0≤k≤1,000,0≤n, m≤k,且n + m = k,0≤a,b≤1,000,000。
时间限制 : 1000 MS 空间限制 : 65536 KB
题解如下:::
法一:
这里联想到注明的杨辉三角 故
所以我们求得
即可。
这里用到一个公式:
开一个数组:f [ i ][ j ]=f [ i ][ j - 1]+f [ i - 1 ][ j ]
故附带码
#include<bits/stdc++.h>
using namespace std;
long long f[1005][1005];
int main() {
long long i,j,a,b,k,n,m;
cin>>a>>b>>k>>n>>m;
for(i=1; i<=k; i++)
for(i=1; i<=k; i++) {
f[i][1]=1;
f[1][i]=1;
}
for(i=2; i<=k; i++)
for(j=2; j<=k; j++)
f[i][j]=(f[i-1][j]+f[i][j-1]);
for(int i=1; i<=k; i++) {
{
for(int j=1; i<=k; j++)
cout<<f[i][j]<<" ";
}
cout<<endl;
}
}
也可以用二次幂
给定一个多项式 (ax+by)k,请求出多项式展开后xy项的系数。
#include<cstdio>
#define maxn 1002
#define mod 10007
#define ll unsigned long long
using namespace std;
int a, b, k, n, m, r, ans;
int C[maxn][maxn];
void ini() {
scanf("%d%d%d%d%d", &a, &b, &k, &n, &m);
r = k - n;
}
int GN(int a, int b, int c) {
int ans = 1;
a %= c;
while(b > 0) {
if(b & 1)ans = (ans * a) % c;
b /= 2;
a = a * a % c;
}
return ans;
}
int MakeC(int x, int y) {
int i, j;
for(i = 0; i <= x; i ++)C[i][0]=1;
for(i = 1; i <= x; i ++)
for(j = 1; j <= y; j ++)C[i][j]=(C[i - 1][j - 1]+C[i - 1][j]) % mod;
return C[x][y];
}
void solve() {
a = GN(a, n, mod);
b = GN(b, m, mod);
ans = (a * b) % mod;
ans = (ans * MakeC(k,r)) % mod;
printf("%d", ans);
}
int main() {
ini();
solve();
}