单点时限: 5.0 sec
内存限制: 256 MB
给定一个多项式 ,计算多项式展开后 项的系数。
输入格式
第 1 行:一个整数 T (1≤T≤100000)为问题数。
接下来共 T 行。每行 5 个整数,分别为 a,b,k,n,m,整数之间由一个空格分隔。
0≤k≤1,000,000,0≤n,m≤k,且 n+m=k,0≤a,b≤10^9。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等)。
然后对应每个问题在一行中输出一个整数,表示所求的系数(这个系数可能很大,输出对 1000000007 取模后的值)。
样例
input
3 1 1 3 1 2 235823 382573 999 111 888 681692776 714636914 287579 7786 279793
output
case #0: 3 case #1: 939550478 case #2: 388290460
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e9+7;
const int NN=1e6+10;
int A[NN];
//阶乘计算
void xx(int a){
A[0]=1;A[1]=1;
for(int i=2;i<=a;i++){
A[i]=(A[i-1]%N)*(i%N)%N;
}return;
}
//快速幂
int quickpower(int a,int b){
int ans=1;
while(b){
if(b&1){
ans=(ans%N)*(a%N)%N;
}a=(a%N)*(a%N)%N;
b>>=1;
ans%=N;
}return ans;
}void print(int a){
cout << a << endl;
}
//组合数运算 运用了Lucas定理
int C(int n,int m){
int a,b;
a=A[m]%N;
// print(a);
b=A[n]%N*A[m-n]%N;
a*=(quickpower(b,N-2)%N);
a%=N;
return a;
}
signed main(){
int T;
cin >> T;
xx(NN-10);
for(int q=0;q<T;q++){
int a,b,k,n,m;
cin >> a >> b >> k >> n >> m;
a%=N;
b%=N;
int ans=1;
ans*=(quickpower(a,n)%N);
ans%=N;
ans*=(quickpower(b,m)%N);
ans%=N;
int cc=C(n,k);
// cout << cc << " " << ans << endl;
ans*=cc;
ans%=N;
cout << "case #" << q << ":\n";
cout << ans << endl;
}return 0;
}