HDU-2049 不容易系列之四(考新郎)

#include<iostream>
 using namespace std;
 int main()
 {
     long long k[25]={0,0,1},g[29];///数组也是一样的long long!
     int t;
     g[0]=1;g[1]=1;g[2]=2;
     long long a,b,c,n=1,m=1,z;///数据比较大,所以要用long long!
     cin>>t;
     for(int i=3;i<25;i++)///计算全错排
     {
         k[i]=(i-1)*(k[i-1]+k[i-2]);
         g[i]=i*g[i-1];
     }
     while(t--)
     {///我的这种计算方式也是没毛病的,但没有用数组把各个数的阶乘存起来的方式高明
         int p;
         cin>>a>>b;
         for(int j=b;j>0;j--)///两个for循环整体计算从a个数中取出b个数有多少种方式
         {
             n=n*(a);
             a--;
         }///先计算了排列数,再用排列数除以b的阶乘!
         for(int y=b;y>0;y--)
         {
             m=m*y;
         }
         cout<<n<<' '<<m<<endl;///看到底是n算错了还是m错了!
         z=n/m;
         cout<<z<<endl;///因为刚开始的时候计算方式上的错误导致计算结果错误;所以就在上面输出了一下n和m!
         cout<<z*k[b]<<endl;
         z=1;n=1;m=1;
         //cout<<k[b]*(g[a]/g[b]/g[a-b])<<endl;
     }///g[a]/g[b]/g[a-b]就是连除,一开始我竟然没有看出来!
     return 0;
 }


知识点总结:

  组合数学加全错排。

心得体会:

  一定要考虑数据范围,记得用long long!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值