题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049
2 2 2 3 2
1 3
思路:组合+错排公式
组合公式:
;错排公式:f[i]=(i-1)*(f[i-1]+f[i-2]) (f[1]=0; f[2]=1;)
#include<stdio.h> #include<string.h> #include<stdlib.h> long long f[25]; long long C(int n,int m) //组合公式 { int i; long long sum1,sum2; sum1=sum2=1; for(i=n;i>=(m+1);i--) sum1*=i; for(i=1;i<=(n-m);i++) sum2*=i; return sum1/sum2; } int main() { int n,m,t; long long ans; f[1]=0; f[2]=1; for(i=3;i<=20;i++) //错排 f[i]=(i-1)*(f[i-1]+f[i-2]); //scanf("%d",&t); while(scanf("%d%d",&n,&m)!=EOF) { //scanf("%d%d",&n,&m); ans=C(n,m)*f[m]; printf("%lld\n",ans); } return 0; }