初始化1e6的数组大约用200MS。1秒的时限处理不完1e7。
const ll M=2*1e6+5;
ll fact[M],ifact[M];//fact[i]是i的阶乘,ifact[i]是阶乘的除法逆元,两者用于求组合数
ll pow_mod(ll n,ll k,ll mod)//快速幂求n^k余m的结果
{
ll res=1;
n=n%mod;
while(k>0)
{
if(k&1)
res=res*n%mod;
n=n*n%mod;
k>>=1;
}
return res;
}
void init()//初始化
{
fact[0]=ifact[0]=1;
for(int i=1;i<M;++i)
{
fact[i]=(fact[i-1]*i)%mod;
}
ifact[M-1]=pow_mod(fact[M-1],mod-2,mod);
for(int i=M-1;i>0;i--)
ifact[i-1]=ifact[i]*i%mod;
}
ll C(ll n,ll m)//求组合数
{
if(n<m)
return 0;
return fact[n]*ifact[m]%mod*ifact[n-m]%mod;
}
稍慢些的另一个初始化方法:
void init()//初始化
{
fact[0]=ifact[0]=1;
for(int i=1;i<M;++i)
{
fact[i]=(fact[i-1]*i)%mod;
ifact[i]=pow_mod(fact[i],mod-2,mod);
}
}