这题习惯性用搜索了,明明知道会超时,依然用了搜索...没想过排列组合这种做法
先选行:有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
对于每一组,输入两个整数n,k;代表n*n的棋盘,k个车;n<=30,k <=n^2
Output
输出:对于每组数据,输出ans,ans为多少种摆放。
hint:数据保证不会超出unsigned long long int
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; }