永发信息网

求杭电2049思路...

答案:2  悬赏:40  手机版
解决时间 2021-04-04 06:23
组合我是弄出来了 还有什么嘛?
#include"stdio.h"
int main()
{
int n,a,b,x,t,i;
__int64 sum;
while(scanf("%d",&n)!=EOF&&n>0)
{
sum=1;
x=1;
scanf("%d %d",&a,&b);
if(a {
i=a;
a=b;
b=i;
}
t=b;
if(a<=1||b<=1||a>20||b>20)
{continue;}
for(;b!=0;b--)
{
sum=sum*a;
a--;
}
for(b=t;b!=0;b--)
{
x=x*b;
}
printf("%I64d\n",sum/x);
}

}
最佳答案
这道题的解法就是组合数和错排公式
组合数不用讲了,就是N个新郎中选出M个新郎;
错排公式递推是:f(n)=(n-1)*(f(n-1)+f(n-2)),n>=3 f(1)=0,f(2)=1;
两个相乘就可以得出答案了
代码的实现是很简单的,希望可以自己打,这样对自己才有好处。
全部回答
看到这个不知道怎么做,排列组合早忘完了,纠结了半天排错公式,然后…… 其实我看了那哥们儿的答案就觉得你的答案很可能是精度不够,但是觉得不只是这么简单的问题,所以纠结呀纠结…… 终于看懂那个排错公式了,发现你的算法是对的…… 然后改了一下 加上这个 #include =============== int sum1,sum2,i; 改成 int i; __int64 sum1,sum2; ================ int mm(int a) 改成 __int64 mm(int a) =============== 当然啦还有这句 cout< #include __int64 mm(int a) { if(a==1){return 0;} else if(a==2){return 1;} else return (a-1)*(mm(a-1)+mm(a-2)); }//求错排数 int main() { int c,n,m; cin>>c; while(c) { cin>>n>>m; int i; __int64 sum1,sum2; i=m;sum1=1;sum2=1; for(i;i>0;i--) { sum1=sum1*n; n--; sum2=sum2*i; }//求n的m组合数(m
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯