ZZULI 1867: 礼上往来【错位排序】

1867: 礼上往来

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 216  Solved: 65

SubmitStatusWeb Board

Description

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

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

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

  

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

  

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

  

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

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

思路:公式:s[i]=(i-1)*(s[i-1]+s[i-2]),s[1]=0,s[2]=1;

AC-code:

[cpp] view plain copy

  1. #include<cstdio>
  2. long long num[110];
  3. int main()
  4. {
  5. int n,i,T;
  6. num[1]=0;num[2]=1;
  7. for(i=3;i<110;i++)
  8. num[i]=(i-1)*(num[i-1]+num[i-2])%1000000007;
  9. scanf("%d",&T);
  10. while(T--)
  11. {
  12. scanf("%d",&n);
  13. printf("%lld\n",num[n]);
  14. }
  15. }

时间: 2024-08-24 02:44:40

ZZULI 1867: 礼上往来【错位排序】的相关文章

QDU67 礼上往来(错排问题)

描述 每当节日来临,女友众多的xxx总是能从全国各地的女友那里收到各种礼物. 有礼物收到当然值得高兴,但回礼确是件麻烦的事! 无论多麻烦,总不好意思收礼而不回礼,那也不是xxx的风格. 现在,即爱面子又抠门的xxx想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,这样就不用再花钱买礼物了! 假设xxx的n个女友每人送他一个礼物(每个人送的礼物都不相同),现在他需要合理安排,再回送每个女友一份礼物,重点是,回送的礼物不能是这个女友之前送他的那个礼物,不然,xxx可就摊上事

组合数学 - 全错位排序公式

不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样.话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的.比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情.如果套用一句经典的评语,我们可以这样总

实现真正意义上的合并排序

(算法老师布置这道题好长时间了,可是一直没有思路,真的是憋出来的代码啊) 真正意义上的合并排序是按照给的数组来判断的,它分的不是两两一组,在四四一组排序,直到完全排完序,真正意义上的合并排序是指 先在数组上找到已有序的数组,分成几块,在进行合并. 代码如下: #include <stdio.h>#define N 10#define flag1 1#define flag2 2int *FindOrder(int *a,int *b) //找到数组里有序的一段{ int i=0,j=0; wh

不容易系列之一(错位排序)

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16597    Accepted Submission(s): 6915 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总

程序员修炼之路-(3)排序(上):基本排序

1 基本排序 对于所有排序算法,被排序元素需要满足下列数学性质: ?  自反性(reflextive):for all v,v=v ?  对称性(antisymmetric):for all v and w,if v<w then w>v and if v=w then w=v ?  传递性(transitive):for all v,w and x,if v<=w and w<=x then v<=x 对于包含这样元素的数组,我们才能对其排序. 1.1 选择排序(selec

Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路

Elias-Fano编码过程如下:把一组整数的最低l位连接在一起,同时把高位以严格单调增的排序划分为桶. Example: 2, 3, 5, 7, 11, 13, 24 Count in unary the size of upper bits "buckets" including empty ones:110=>计算最大的桶,此处是110,计算方法如下:Maximum bucket: [U / 2^l]Example: [24 / 2^2] = 6 = 110 连接最低位:

排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然排序的显著目的是排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为某些成型算法的一部分. 总的来说,排序算法分为两大类:比较排序 和 线性时间排序. 比较排序依赖于比较和交换来将元素移动到正确的位置上.它们的运行时间往往不可能小于O(nlgn). 对于线性时间排序,它的运行时间往往与它处理

【干货】史上最好的排序和数据结构入门

前言 工作已经有一段时间了,有的时候会跟同事们打趣:"如果你让我现在去手写一个快速排序,我怕是真的写不出来". 如果不接触一段时间的算法,真的很容易就忘了.不信?你现在想想你自己能不能手写一个堆排序. 经历过校招的人都知道,算法和数据结构都是不可避免的. 在笔试的时候,最主要的就是靠算法题.像拼多多.头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有. 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的.我们可以想象一个场景,一面面试面到一

UVA 11481 Arrange the Numbers(组合数学 错位排序)

题意:长度为n的序列,前m位恰好k位正确排序,求方法数 前m位选k个数正确排,为cm[m][k],剩余m - k个空位,要错排,这m - k个数可能是前m个数中剩下的,也可能来自后面的n - m个数 考虑这样一个问题,共n个数,前i位错排的方法数,显然dp[i][0] = i! 递推考虑:处理到第i个数时,等价于前i - 1个数错排的方法数减去在前i - 1个数错排的情况下第i位恰好为i的方法数,后者相当于n - 1个数前i - 1位错排 所以 dp[n][i] = dp[n][i - 1] -