列表

详情


NC232564. Cubes

描述

12根木条搭建正方体,给出每根木条颜色,木条颜色编号16,求能搭建不同的正方体的数量。
两个正方体不能在旋转翻转等操作后重合,视为不同。

输入描述

第一行包含一个正整数,表示T组数据。
接下来T行,每一行包含12个正整数,表示木棒的颜色。

输出描述

输出T行,每一行输出一个整数表示答案。

示例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;
}

上一题