这个题其实就是一个高中排列组合知识的应用,这里记录一下吧,虽然挺简单的。
就是有N篇作文,每个人拿一篇, 然后不能拿自己的,问有多少种取法;
递推公式: f[i]=(i-1)*(f[i-1]+f[i-2])
简单证明就是:设N个人为a,b,c,d...,N篇作文为A,B,C,D...
若a拿b的 ,b也拿a的,则显然只剩下N-2个人拿作文,自然是f(N-2)种了.
若a拿b, b没拿a的 ,(这个就跟b没拿自己的一样,去掉一种情况而已) 则显然与N-1个人拿卡一样,自然是f(N-1)种了.
而a不一定拿B, 只要是B,C,D...(N-1个)中的一个就可以了,所以在f(N-1)+f(N-2)再乘上N-1就行了.
代码:
/* Accepted 3266 C++ 0.3K 0'00.00" 1352K 3012216103 */ #include <iostream> using namespace std; int main() { int f[15]; f[0]=0;f[1]=0;f[2]=1; for(int i=3;i<14;i++) f[i]=(i-1)*(f[i-1]+f[i-2]); int t,n; cin>>t; while(t--) { cin>>n; cout<<f[n]<<endl; } }