您的位置:首页 > 其它

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

2017-09-18 18:02 274 查看
#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!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: