由于$k$达到了$1 \times 10^6$的量级,因此预处理打表递推不现实。
一个可行的方法是Lucas定理:
$$C_q^r \bmod p \equiv q!{(r!(q - r)!\bmod p)^{p - 2}}\bmod p$$
代码如下:
#include <string>
#include <vector>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <queue>
using namespace std;
typedef long long ll;
const ll ceil=1000000007;
ll factors[1000001];
void genlist()
{
for(ll i=0;i<1000001;i++){
if(i==0)
factors[i]=1;
else if(i==1)
factors[i]=1;
else
factors[i]=((factors[i-1]%ceil)*(i%ceil))%ceil;
}
}
ll fastmod(ll a,ll b)
{
ll ret=1;
while(b){
if(b&1)
ret=((ret%ceil)*(a%ceil))%ceil;
a=((a%ceil)*(a%ceil))%ceil;
b>>=1;
}
return ret;
}
ll comp(ll n, ll m)
{
ll res=factors[n]*fastmod((factors[m]*factors[n-m])%ceil,ceil-2)%ceil;
return res;
}
int main()
{
genlist();
int t;
cin>>t;
for(int i=0;i<t;i++){
ll a,b,k,n,m;
cin>>a>>b>>k>>n>>m;
ll comb=comp(k,m);
ll coef_a=fastmod(a,n);
ll coef_b=fastmod(b,m);
ll res=((coef_a%ceil)*(coef_b%ceil))%ceil;
res=((res%ceil)*(comb%ceil))%ceil;
cout<<"case #"<<i<<":"<<endl;
cout<<res<<endl;
}
}
组合数开一维数组dp,a^m*b^n用快速幂,但还是超时了(落泪)
nb