我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0
这道题是问题求解和程序设计的作业题,刚拿到这道题的时候,我完全没与递推的概念,第一反应完全是离散数学里面叫得容斥原理,典型的错排问题,一共有n对新人,有m对是错误的,首先通过c(n,m)选出错误的新人是哪些,然后就是算出这m对新人错误排列的方法。
根据容斥原理的公式推出m对错误的情况有m!-c(m,1)(m-1)!+c(m,2)(m-2)!+.....+(-1)^mc(m,m)0!;
在乘上c(n,m)就好了
化简后得a(n,m)(1-1/1!+1/2!-....+(-1)^m/m!);
算到这里我就犯愁了,这括号了的这些个东西怎么算阿,脑子完全堵住了,缓过神来才发现,要实现它并不困难
程序如下:
 1#include<stdio.h>
 2__int64 f(int n,int m){
 3    __int64 r,tmp1=1;
 4    int i;
 5    for(i=n;i>n-m;i--)
 6        tmp1*=i;
 7    r=tmp1;
 8    for(i=1;i<=m;i++){
 9        tmp1=(-tmp1)/i;
10        r+=tmp1;}
11    return r;
12}
13int main(){
14    int t,m,n;
15    __int64 result;
16    scanf("%d",&t);
17    while((t--)>0){
18        scanf("%d%d",&n,&m);
19        result=f(n,m);
20        printf("%I64d\n",result);
21    }
22    return 0;
23}
posted on 2008-03-02 17:03 zoyi 阅读(223) 评论(1)  编辑 收藏 引用 所属分类: acm

FeedBack:
# re: ecnu 1129
2008-03-05 01:30 | 张棚
我这道题wa 了好多次,
实在不行了,就搜到这里了。。
哎。。
我的容斥原理没学好,推错了。。。
学习学习。。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜