SDOI 2016 排列计数

题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列

保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
int fac[1000010];
int inv[1000010];
int f[1000010];
int T,n,m;
int power(int x,int y){
    int s=1;
    while(y){
        if(y&1)s=1ll*s*x%mod;
        y>>=1,x=1ll*x*x%mod;
    }return s;
}
inline int read(){
    int s=0;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar());
    for(;ch>='0'&&ch<='9';ch=getchar())s=s*10+ch-'0';
    return s;
}
int main(){
    freopen("menci_permutation.in","r",stdin);
    freopen("menci_permutation.out","w",stdout);
    fac[0]=1;
    for(int i=1;i<=1000000;++i)fac[i]=1ll*fac[i-1]*i%mod;
    inv[1000000]=power(fac[1000000],mod-2);inv[0]=1;
    for(int i=1000000-1;i;--i)inv[i]=1ll*inv[i+1]*(i+1)%mod;
    f[1]=0;f[2]=1;f[0]=1;
    for(int i=3;i<=1000000;++i)f[i]=1ll*(i-1)*(f[i-1]+f[i-2])%mod;
    T=read();
    while(T--){
        n=read();m=read();
        printf("%d\n",1ll*fac[n]*inv[m]%mod*inv[n-m]%mod*f[n-m]%mod);
    }return 0;
}
View Code

 

posted @ 2016-04-11 20:17  117208  阅读(239)  评论(0编辑  收藏  举报