1002-排列组合

这题习惯性用搜索了,明明知道会超时,依然用了搜索...没想过排列组合这种做法

先选行:有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[n][k])
		{
			cout<<dp[n][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[n][k]=sum1;
			cout<<sum1<<endl;
		}
	}
return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值