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

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

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
 

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[n]);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值