小数据AC,大数据TLE。。。
题目1 : 扑克牌
时间限制:
2000ms 单点时限:
1000ms 内存限制:
256MB
描述
一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。
牌的表示方法为XY,其中X为面值,为2、3、4、5、6、7、8、9、T、J、Q、K、A中的一个。Y为花色,为S、H、D、C中的一个。如2S、2H、TD等。
输入
第一行为一个整数T,为数据组数。
之后每组数据占一行。这一行首先包含一个整数N,表示给定的牌的张数,接下来N个由空格分隔的字符串,每个字符串长度为2,表示一张牌。每组数据中的扑克牌各不相同。
输出
对于每组数据输出一行,形如”Case #X: Y”。X为数据组数,从1开始。Y为可能的方案数,由于答案可能很大,请输出模264之后的值。
数据范围
1 ≤ T ≤ 20000
小数据
1 ≤ N ≤ 5
大数据
1 ≤ N ≤ 52
样例输入
5 1 TC 2 TC TS 5 2C AD AC JC JH 4 AC KC QC JC 6 AC AD AS JC JD KD
样例输出
Case #1: 1 Case #2: 0 Case #3: 48 Case #4: 24 Case #5: 120
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
long long ans;
int v[55];
int k[55];
int t[14][5];
int jiecheng(int x){
int ans=1;
for(int i=1;i<=x;i++)ans*=i;
return ans;
}
void func(int v[],int k[],int n ) {
sort(v, v + n);
do {
bool f=false;
for(int i = 0; i < n-1; i++) {
if(v[i] == v[i+1]) {
f=true;
break;
}
}
if(f==false) {
ans++;
}
} while (next_permutation(v, v + n));
}
int main() {
int T,n;
//ifstream in("/Users/urey/data/input");
cin>>T;
for(int i=1;i<=T;i++) {
cin>>n;
string p;
ans=0;
memset(v,0,sizeof(v));
memset(k,0,sizeof(k));
memset(t,0,sizeof(t));
for(int j=0;j<n;j++) {
cin>>p;
if(p[0]=='T') v[j]=10;
else if(p[0]=='J') v[j]=11;
else if(p[0]=='Q') v[j]=12;
else if(p[0]=='K') v[j]=13;
else if(p[0]=='A') v[j]=1;
else v[j]=p[0]-'0';
if(p[1]=='S') k[j]=1;
else if(p[1]=='H') k[j]=2;
else if(p[1]=='D') k[j]=3;
else if(p[1]=='C') k[j]=4;
}
for(int j=0;j<n;j++) {
t[v[j]][k[j]]++;
}
func(v,k,n);
for(int j=1;j<=13;j++) {
int sum=0;
for(int m=1;m<=4;m++) {
sum+=t[j][m];
}
ans*=jiecheng(sum);
}
cout<<"Case #"<<i<<": "<<ans%(long)pow(2,64)<<endl;
}
return 0;
}