hdu1292
"下沙野骆驼"ACM夏令营
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 541 Accepted Submission(s): 254
Problem Description
大家都知道,杭电计算机学院为了吸引更多的学生参与到程序设计竞赛中去,从2005年秋天,开始举行月赛,并一直坚持到了现在。事实表明,这项措施的效果还是很明显的,现在坚持参加训练的学生比以前有了较大幅度的增长,整体水平也有了较大的提高。 为了更好的促进这项竞赛的发展,计算机学院又有了新的计划:准备在每年的暑假举行一个为期半个月的程序设计夏令营活动,活动的全称是“下沙野骆驼ACM夏令营”,准备邀请全球的编程高手共同训练,邀请对象当然少不了HFUT的DYGG,NIT的DGMM,ZJUT的QWDD,如果QH的LTC一定要来,我们也不会嫌弃,虽然他水平比其他人差了些,毕竟是杭州人,要给点面子的,再说,共同进步才是我们的最终目的,呵呵。 活动的安排初步定为7项内容,具体是: 1、第一天,倒时差(主要照顾欧美的选手)。 2、第二天,参观杭电校园,并在参观结束举行有奖竞答,偷偷透露一下,题目我已经设计好了:“杭电校院一共有几棵树?”(正确答案:3897棵),答对的营员奖励雪糕一支(不是哈根达斯,是杭州五丰生产的,民族工业还是要支持的)。 3、第三天,参观杭电ACMer的寝室,主要目的是让部分来自资本主义国家的选手看看我们是如何管理学生宿舍的,其中一项重要内容是向全球推广我校首创的“党员模范寝室”。 4、第四天,练习赛,题目只有一个:“非著名高校HD一共有教职工num个,分布在X个部门,假设每个部门有y1个正处级领导,y2个副处级领导,y3个付处级调研员,y4个正科级干部,y5个副科级干部,请输出HD的领导人员占教职工总数的比例,结果保留两位小数。”(告诉你,这个题目对于欧美选手来说有个陷阱,最后的结果可能大于100%!这是他们如何也想不到的:) 5、第五天~第十三天,算法交流,主要讨论如何求两个数的最小公倍数。 6、第十四天,自由组队(每队人数不限,呵呵,注意了),参加“下沙野骆驼杯”程序设计大赛,冠军将获得一匹下沙的野骆驼(我们主场不知道有没有机会...) 7、最后一天,篝火晚会,主题:“ACM,你到底爱不爱我?!”,主持人:骆驼王子和他一个普通老同学。
负责这次夏令营活动的是05级的小师弟Linle(一个打字速度很快,号称仅次于Fe(OH)2的小伙子),他很聪明,也很勤奋,现在他就在思考一个问题,如果一共来了n个同学,按照组队规则,一共会有多少种不同的组队方案呢?
负责这次夏令营活动的是05级的小师弟Linle(一个打字速度很快,号称仅次于Fe(OH)2的小伙子),他很聪明,也很勤奋,现在他就在思考一个问题,如果一共来了n个同学,按照组队规则,一共会有多少种不同的组队方案呢?
Input
输入数据的第一行是一个整数C(1<C<25),表示测试实例的数目,然后是C行数据,每行一个整数n(0<n<25),表示营员的人数。
Output
对于每组输入数据,请输出组队的方案数目,每个测试实例占一行。
Sample Input
3
1
2
3
Sample Output
1 2 5
大神的解:
题目:一共来了n(0<n<25)个同学,按照组队规则(自由组队,每队人数不限),一共会有多少种不同的组队方案呢? 递推式是:a[i][j]=a[i-1][j-1]+a[i-1][j]*j;
题解:关于本题自己一直没有思路,看了公式后也理解了好一会。
首先,将所有人按小组数量列出数组如:分成1个组,两个组........N个组,其中1个组和N个组的方案数都为1。
其次,计算其它分组的方案各有多少种。这里就是这个公式的关键了:
先将比当前少一个人并且少一个分组总数的方案直接加上(新加入的人直接新建一组,就得到人数与分组数与目标方案匹配),
再将少一人但分组数量相同的方案数乘以分组的数量(每个方案中最后的这一个人都可加到该方案的各组,使得人数匹配)。
最后,将不同分组数量的所有方案相加,得出总的方案数。
而且,a[i][0]应该是为0,不为1的。
- #include<iostream>
- #include<cstdio>
- using namespace std;
- int main()
- {
- __int64 a[26][26];
- a[1][0]=0;
- a[1][1]=1;
- int i,j,t;
- for(i=2;i<=25;i++)
- {
- a[i][0]=0;
- a[i][i]=1;
- for(j=1;j<i;j++)
- a[i][j]=a[i-1][j-1]+a[i-1][j]*j;
- }
- scanf("%d",&t);
- while(t--)
- {
- int n;
- scanf("%d",&n);
- __int64 sum=1;
- for(i=2;i<=n;i++)
- {
- sum+=a[n][i];
- }
- printf("%I64d\n",sum);
- }
- return 0;
- }