Cubes UVA10601 POLYA定理
Posted mooleetzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cubes UVA10601 POLYA定理相关的知识,希望对你有一定的参考价值。
Solution
二元组$(i,j)$表示循环节个数,循环个数。(组合数学里叫等价类和K不动置换类?)
不变置换:$1*(1,12)$
面心$+90:3*(4,3)$
面心$-90:3*(4,3)$
面心$180:3*(2,6)$
对棱$180:6*[(2,5)+(1,2)]$
体心$120:4*(3,4)$
体心$240:4*(3,4)$
那么剩下的问题就是如何将颜色填入这些等价类里面
颜色看作有区别的球,等价类看作无区别盒子,一个组合问题
/* 二元组(i,j)表示循环节个数,循环个数,组合数学里叫K不动置换类和等价类 不变置换:1*(1,12) 面心+90:3*(4,3) 面心-90:3*(4,3) 面心180:3*(2,6) 对棱180:6*[(2,5)+(1,2)] 体心120:4*(3,4) 体心240:4*(3,4) */ #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #if __cplusplus >= 201103L #include <unordered_map> #include <unordered_set> #endif #include <vector> #define lson rt << 1, l, mid #define rson rt << 1 | 1, mid + 1, r #define LONG_LONG_MAX 9223372036854775807LL #define ll LL using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int, int> P; int n, m, k; const int maxn = 1e5 + 10; int a[7], b[7]; inline ll fac(ll n) ll res = 1; for (int i = 2; i <= n; i++) res *= i; return res; inline ll C(ll n, ll m) if (n < m) return 0; return fac(n) / (fac(m) * fac(n - m)); inline ll doit(int k) memcpy(b, a, sizeof a); int group = 0; for (int i = 1; i <= 6; i++) if (b[i] % k) return 0; //不能完全以k划分 b[i] /= k; group += b[i]; ll res = 1; for (int i = 1; i <= 6; i++) res *= C(group, b[i]); group -= b[i]; return res; inline ll solve() ll res = 0; res += doit(1); //不动置换 res += 2 * 3 * doit(4); //面心+90,-90 res += 3 * doit(2); //面心180 for (int i = 1; i <= 6; i++) for (int j = 1; j <= 6; j++) if ((i == j && a[i] < 2) || (i != j && (!a[i] || !a[j]))) continue; a[i]--, a[j]--; res += 6 * doit(2); //对棱180 a[i]++, a[j]++; res += 2 * 4 * doit(3); //体心+120,-120 return res / 24; int main(int argc, char const *argv[]) #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) memset(a, 0, sizeof a); for (int i = 0; i < 12; i++) int x; cin >> x; a[x]++; cout << solve() << "\n"; return 0;
以上是关于Cubes UVA10601 POLYA定理的主要内容,如果未能解决你的问题,请参考以下文章
Arif in Dhaka (First Love Part 2) UVA - 10294(Polya定理)
[P4980] 模板Polya定理 - Polya定理,欧拉函数
Polya 定理入门[Burnside引理,Polya定理,欧拉函数]