礼上往来
发布时间: 2016年1月3日 19:13 最后更新: 2016年1月3日 19:15 时间限制: 1000ms 内存限制: 128M
描述
每当节日来临,女友众多的xxx总是能从全国各地的女友那里收到各种礼物。
有礼物收到当然值得高兴,但回礼确是件麻烦的事!
无论多麻烦,总不好意思收礼而不回礼,那也不是xxx的风格。
现在,即爱面子又抠门的xxx想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,这样就不用再花钱买礼物了!
假设xxx的n个女友每人送他一个礼物(每个人送的礼物都不相同),现在他需要合理安排,再回送每个女友一份礼物,重点是,回送的礼物不能是这个女友之前送他的那个礼物,不然,xxx可就摊上事了,摊上大事了……
现在,xxx想知道总共有多少种满足条件的回送礼物方案呢?
输入
输入数据第一行是个正整数T,表示总共有T组测试数据(T <= 100); 每组数据包含一个正整数n,表示叽叽哥的女友个数为n( 1 <= n <= 100 )。
输出
请输出可能的方案数,因为方案数可能比较大,请将结果对10^9 + 7 取模后再输出。 每组输出占一行。
样例输入1 复制
3
1
2
4
样例输出1
0
1
9
错排公式:
n 个不同元素的一个错排可由下述两个步骤完成:
第一步,“错排” 1 号元素(将 1 号元素排在第 2 至第 n 个位置之一),有 n - 1种方法。
第二步,“错排”其余 n - 1 个元素,按如下顺序进行。视第一步的结果,若1号元素落在第 k 个位置,第二步就先把 k号元素“错排”好, k 号元素的不同排法将导致两类不同的情况发生:
1、 k 号元素排在第1个位置,留下的 n - 2 个元素在与它们的编号集相等的位置集上“错排”,有 f(n -2)种方法;
2、 k 号元素不排第 1 个位置,这时可将第 1 个位置“看成”第 k个位置(也就是说本来准备放到k位置为元素,可以放到1位置中),于是形成(包括 k 号元素在内的) n - 1 个元素的“错排”,有f(n - 1) 种方法。据加法原理,完成第二步共有 f(n - 2)+f(n - 1)种方法。
根据乘法原理, n 个不同元素的错排种数
f(n) = (n-1)[f(n-2)+f(n-1)] (n>2)。
AC代码
#include<stdio.h>
using namespace std;
const int mod = 1000000007;
int main()
{
int t,n;
long long a[200] = {0,0,1},i,j;
for(i = 3; i<=100; i++)
a[i] = ((a[i-1]+a[i-2])%mod)*(i-1)%mod;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%lld\n",a[n]);
}
return 0;
}
本文探讨了一种特定的排列组合问题——错排问题,并提供了一个C++实现的例子。问题背景设定为节日间如何合理地交换礼物,确保没有人收到自己送出的礼物。通过递推公式计算所有可能的交换方案。
450

被折叠的 条评论
为什么被折叠?



