您的位置:首页 > 其它

1002-排列组合

2015-11-22 23:28 381 查看
这题习惯性用搜索了,明明知道会超时,依然用了搜索...没想过排列组合这种做法

先选行:有Cn,m种做法,再选列:并可交换有An,m

所以总共有An,m*Cn,m种方式。

题目大意:

会长大人由于经常不玩象棋,于是把象棋充公了~奇怪的是象棋里面没有象(这是为什么呢?象棋没有象还怎么玩啊),不过不要紧,我们还有车!

好吧,上次马被玩坏了,这次来玩车(本来这次玩象,可是会长表示并不想把“对象”借我们玩⊙﹏⊙),象棋里的车,它能竖着走,还能横着走,但是当它遇到处于同行同列的车的时候,这两个车就产生了冲突,给定两个整数n和k,代表n*n的棋盘,和k个车,问你有多少种摆放,使任意两个车都没有冲突。

Input

一行输入一个T(T<=1000000),代表测试数据组数。

对于每一组,输入两个整数n,k;代表n*n的棋盘,k个车;n<=30,k <=n^2

Output

输出:对于每组数据,输出ans,ans为多少种摆放。

hint:数据保证不会超出unsigned long long int

Sample Input

8
1 1
2 4
3 1
4 1
4 2
4 3
4 4
4 5


Sample Output

1
0
9
16
72
96
24
0

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
unsigned long long n,k,sum;
unsigned long long dp[35][35*35];
int main()
{
unsigned long long T,i,j;
scanf("%llu",&T);
memset(dp,0,sizeof(dp));
while(T--)
{
sum=1;
scanf("%llu%llu",&n,&k);
if(n<k)
{
printf("0\n");
continue;
}
else if(dp
[k])
{
cout<<dp
[k]<<endl;
continue;
}
else
{
for(i=n;i>=n-k+1;i--)
{
sum*=i;
}
unsigned long long sum1=sum;
sum=1;
for(i=n;i>=n-k+1;i--)
{
sum=sum*i/(n-i+1);
}
sum1*=sum;
dp
[k]=sum1;
cout<<sum1<<endl;
}
}
return 0;
}

[/code]


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: