您的位置:首页 > 其它

HDU:4535 吉哥系列故事——礼尚往来(数学:错排)

2016-04-10 21:07 323 查看


吉哥系列故事——礼尚往来

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 1365 Accepted Submission(s): 696



Problem Description

  吉哥还是那个吉哥

  那个江湖人称“叽叽哥”的基哥

  

  每当节日来临,女友众多的叽叽哥总是能从全国各地的女友那里收到各种礼物。

  有礼物收到当然值得高兴,但回礼确是件麻烦的事!

  无论多麻烦,总不好意思收礼而不回礼,那也不是叽叽哥的风格。

  

  现在,即爱面子又抠门的叽叽哥想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,这样就不用再花钱买礼物了!

  

  假设叽叽哥的n个女友每人送他一个礼物(每个人送的礼物都不相同),现在他需要合理安排,再回送每个女友一份礼物,重点是,回送的礼物不能是这个女友之前送他的那个礼物,不然,叽叽哥可就摊上事了,摊上大事了......

  

  现在,叽叽哥想知道总共有多少种满足条件的回送礼物方案呢?

Input

输入数据第一行是个正整数T,表示总共有T组测试数据(T <= 100);

每组数据包含一个正整数n,表示叽叽哥的女友个数为n( 1 <= n <= 100 )。

Output

请输出可能的方案数,因为方案数可能比较大,请将结果对10^9 + 7 取模后再输出。

每组输出占一行。

Sample Input

3
1
2
4


Sample Output

0
1
9


Source

2013腾讯编程马拉松复赛第二场(3月30日)

Recommend

liuyiding | We have carefully selected several similar problems for you: 5664 5663 5662 5661 5660

用错排做,错排是小学奥数的东西。。。

错排推倒:

甲,乙,丙,丁,戊,五个人各自分别制作了一份新年贺卡,然后各自送给这五个人中的一个而不是自己,且最

后谁都能得到贺卡,共有多少种送出的方法?

雪帆奥数王老师分析与提示:

这种题一般都采用树形图结合枚举处理。

枚举方法如下(为了方便起见,A对着1,B对着2,依次类推)

A对着2,3,4,5,种类是一样的,所以只要枚举其中一类,然后乘以4即可。

A-2 (A-3,4,5,这四种是对称的,只枚举一种情况,到时候乘以4即可)

B-1 B-3,4,5(这三种也是对称的,可以只枚举B-3,到时候乘以3即可)

C-4,5,×2 ) C-1 C-4 (C-5 , ×2)

D-5 D-5 D-5

E-3 E-4 E-1

所以方法为

【(1×2)+(1+1×2)×3】×4=44 种

但是人数较多怎么办呢?能不能找到一定的规律呢?

探讨方法如下:

先从1个人开始讨论,如果是一个人制作了一份新年贺卡,很显然只能是0种

如果是两个人,那么他们可以互相交换,1种方法,

如果是三个人,通过枚举,也只有2种方法,继续讨论递推关系

设n个不同元素分别标号1,2,3,……,n,要求它们分别被放入标号为1,2,3,……,n的位置上,一个位置

有且只有一个元素,且元素的标号与位置的标号不能相同,记其方法数为(排列与组合)错排问题

从中任取一个元素,不妨取1号元素,还剩n-1个元素,再从这n-1个元素对应的位置中选一个,共n-1种方法

假设选取的位置是2号位,以下分两种情况

第一种,1号元素放入2号位置且2号元素也放入1号位置,此时剩下n-2个元素继续错排,共(排列与组合)错排问题种方法

第二种,1号元素放入2号位置但2号元素不放入1号位置,既然2号元素不放入1号位置,不妨把2号元素看作1号元

素,于是等价于新的1号元素不放入1号位置(雪帆老师提示:好好理解这句话的意思),那么剩下n-1个元素继续错排,共(排列与组合)错排问题种方法

于是得到递推式(排列与组合)错排问题

(排列与组合)错排问题

所以,三个元素错排是(3-1)(0+1)=2(种)方法,四个元素错排是(4-1)(1+2)=9(种)方法,四个元素错排有

五个元素错排是(5-1)(2+9)=44(种)方法,……

错排递推公式

F(n)=(n-1)(F(n-1)+F(n-2)) F表示方法。F(n)表示n个物体错排的种类

#include <stdio.h>
#define mod 1000000007
long long a[101];//得用long long ,int过不了
void dabiao()
{
a[1]=0;
a[2]=1;
for(int i=3;i<101;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2])%mod;
}
}
int main()
{
int t;
scanf("%d",&t);
dabiao();
while(t--)
{
int n;
scanf("%d",&n);
printf("%lld\n",a
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 排列组合