NC232564. Cubes
描述
输入描述
第一行包含一个正整数,表示组数据。
接下来行,每一行包含12个正整数,表示木棒的颜色。
输出描述
输出行,每一行输出一个整数表示答案。
示例1
输入:
3 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 3 3 4 4 5 5 6 6
输出:
1 5 312120
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2022-10-19 16:54:03
#include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; int d[8]; ll fact[15]; ll get(ll s, int x) { for (int i = 1; i <= 6; i++) { if (d[i] % x != 0) return 0; s = s / fact[d[i] / x]; } return s; } int main() { fact[0] = 1; for (int i = 1; i <= 12; i++) { fact[i] = fact[i - 1] * i; } int T; scanf("%d", &T); while (T--) { memset(d, 0, sizeof(d)); for (int i = 0; i < 12; i++) { int a; scanf("%d", &a); d[a]++; } ll ans = 0; ans += get(fact[12], 1); ans += 8 * get(fact[4], 3); ans += 3 * get(fact[6], 2); ans += 6 * get(fact[3], 4); for (int i = 1; i <= 6; i++) { if (d[i] == 0) continue; d[i]--; for (int j = 1; j <= 6; j++) { if (d[j] == 0) continue; d[j]--; ans += 6 * get(fact[5], 2); d[j]++; } d[i]++; } printf("%lld\n", ans / fact[4]); } return 0; }
C++ 解法, 执行用时: 4ms, 内存消耗: 436K, 提交时间: 2022-07-21 20:51:30
#include<bits/stdc++.h> using namespace std; int cnt[7]; long long jie[13]; long long calc(int n/*个数*/,int c/*大小*/) { for(int i=1;i<=6;i++) if(cnt[i]%c)return 0; long long ans=jie[n]; for(int i=1;i<=6;i++) ans/=jie[cnt[i]/c]; return ans; } int main() { jie[0]=1; for(int i=1;i<=12;i++) jie[i]=jie[i-1]*i; int _; scanf("%d",&_); while(_--) { int col; for(int i=1;i<=12;i++) { scanf("%d",&col); cnt[col]++; } long long ans=0; ans+=calc(12,1); ans+=calc(4,3)*8; ans+=calc(6,2)*3; ans+=calc(3,4)*6; for(int i=1;i<=6;i++)if(cnt[i]) { cnt[i]--; for(int j=1;j<=6;j++)if(cnt[j]) { cnt[j]--; ans+=calc(5,2)*6; cnt[j]++; } cnt[i]++; } printf("%lld\n",ans/24); if(_)for(int i=1;i<=6;i++)cnt[i]=0; } return 0; }