bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数

时间:2023-03-09 08:08:47
bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数

http://www.lydsy.com/JudgeOnline/problem.php?id=4517

组合数+错排公式

#include<cstdio>
#include<iostream> using namespace std; #define N 1000001 const int mod=1e9+; long long fac[N],inv[N],f[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int Pow(long long a,int b)
{
long long res=;
for(;b;a=a*a%mod,b>>=)
if(b&) res=res*a%mod;
return res;
} int main()
{
freopen("permutation.in","r",stdin);
freopen("permutation.out","w",stdout);
fac[]=fac[]=;
for(int i=;i<N;++i) fac[i]=fac[i-]*i%mod;
inv[]=inv[]=;
for(int i=;i<N;++i) inv[i]=Pow(fac[i],mod-);
f[]=f[]=;
for(int i=;i<N;++i) f[i]=(i-)*(f[i-]+f[i-])%mod;
int T,n,m;
read(T);
while(T--)
{
read(n); read(m);
printf("%d\n",int(f[n-m]*fac[n]%mod*inv[m]%mod*inv[n-m]%mod));
}
fclose(stdin); fclose(stdout);
return ;
}