排列组合-错排

来源:互联网 发布:Android list内存优化 编辑:程序博客网 时间:2024/06/06 00:02
//错排公式f(n) = (n-1)[f(n-2)+f(n-1)] (n>2)//HDU - 2049 #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cctype>#include<algorithm>#include<vector>#include<set>#include<deque>using namespace std;long long shz[23];void dis(){    for(int i=1;i<=20;i++){        cout<<shz[i]<<endl;    }    cout<<" test"<<endl;}void init(){    shz[1]=0,shz[2]=1;    for(int i=3;i<=20;i++){        shz[i]=(i-1)*(shz[i-1]+shz[i-2]);    }//  dis();}long long gcd(long long a,long long b){    return b?gcd(b,a%b):a;}long long cal(long long a,long long b){    long long temp1=1;    long long temp2=1;    for(int i=b;i>=1;i--){        temp1*=a--;        temp2*=i;        long long gd=gcd(temp1,temp2);        temp1/=gd;        temp2/=gd;    }    return temp1; }int main(){    init();    int cas,n,m;    cin>>cas;    while(cas--){        cin>>n>>m;        cout<<(long long)shz[m]*cal(n,m)<<endl;    }    return 0;}
0 0
原创粉丝点击