- 描述
- 因为长期钻研算法,无暇考虑个人问题,北航ACM/ICPC训练小组的帅哥们大部分都是单身。某天,他们在机房商议一个绝妙的计划“一卡通大冒险”。这个计划是由Wash最先提出的,计划的内容是,把自己的联系方式写在校园一卡通的背面,然 后故意将自己的卡“遗失”在某处(如水房,TD,食堂,主M……)他们希望能有MM看到他们“遗失”卡,能主动跟他们联系,这样就有机会请MM吃饭了。
他们决定将自己的一卡通夹在几本相同的书里,然后再将书“遗失”到校园的各个角落。正当大家为这个绝妙的计划叫好的时候,大家想到一个问题。
很明显,如果只有一张一卡通,那么只有一种方法,即,将其夹入一本书中。
当有两张一卡通时,就有了两种选择,即,将两张一卡通夹在一本书里,或者分开夹在不同的书里。
当有三张一卡通时,他们就有了五种选择,即: 【〖A〗 〖B〗 〖C〗】 【〖AB〗 〖C〗】 【〖BC〗 〖A〗】 【〖AC〗 〖B〗】 【〖ABC〗】
于是,这个邪恶计划的组织者Wash希望了解,如果ACM/ICPC训练小组里有n为帅哥(即有N张一卡通),那么要把这些一卡通夹到书里有多少种不同的方法。
- 输入
- 包含多组数据,第一行为n,表示接下来共有n组数据。以下n行每行一个数x,表示共有x张一卡通。(1<=x<=2000)。
- 输出
- 对每组测试数据,输出一行:不同的方法数 ,因为这个数可能非常大,我们只需要它除以10000的余数 。
- 样例输入
-
4 1 2 3 100
- 样例输出
-
1 2 5 751
题目中有个要点:一个是把第i张卡放入第j本书,一个是把第i张卡不放入第j本书
#include<stdio.h> int f[2001][2001]; int n,t,s; int main() { int i,j; for(i=1;i<=2000;i++) { f[i][i]=1; f[i][1]=1; } for(i=3;i<=2001;i++) for(j=2;j<i;j++) { f[i][j]=f[i-1][j]*j+f[i-1][j-1]; if(f[i][j]>10000) f[i][j]%=10000; } scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&t); s=0; for(j=1;j<=t;j++) s+=f[t][j]; if(s>10000) s%=10000; printf("%d\n",s); } return 0; }
如果我看到有一本掉落的我看不懂的书,我是绝对不会把它翻开来的(虽然我是男的)…
好好考虑考虑应该夹在什么书里吧
:D
额……哈哈,或许换个更可爱点的小饰物更好