日常训练 20160601 B君的关系 羊毛 (Wolle) Burnside
来源:互联网 发布:淘宝代销怎么没有了 编辑:程序博客网 时间:2024/06/11 18:27
题意简述:给一个
如果不考虑颜色置换,枚举四个方向上置换走几步能走完
考虑一种排列的颜色置换,这种置换有用的不是置换本身,而是这个置换中的每个轮换的长度,考虑颜色置换中每一种轮换的长度,如果轮换长度
本题是要考虑所有排列的颜色置换,那么先将
最后除以置换方案种类数即可,别忘记除以颜色置换的方案种类数。
#include<bits/stdc++.h>#define pow HAtypedef long long ll;const int P = 1e9 + 7;int A, B, C, D, col, cnt, temp[20], sp[250][20], phi[1001], a[100], b[100], c[100], d[100];ll fac[20], kind[250], l, ans;void dfs(int dep, int n, int last) { if (n == 0) { cnt++; for (int i=1; i < dep; i++) sp[cnt][temp[i]]++; return; } for (int i=n; i >= last; i--) temp[dep] = i, dfs(dep + 1, n - i, i);}ll gcd(ll a, ll b) {if (b == 0) return a; return gcd(b, a % b); }ll lcm(ll a, ll b) {return a * b / gcd(a, b); }ll pow(ll x, ll k) { ll ans = 1; for (; k; k >>= 1, x = x * x % P) if (k & 1ll) ans = ans * x % P; return ans;}ll calc(ll x, int i) { ll ans = 0; for (int j=1; j <= col; j++) if (x % j == 0) ans += sp[i][j] * j; return ans;}void find(int n, int a[]) { for (int i=1; i * i <= n; i++) if (n % i == 0) a[++a[0]] = i, a[++a[0]] = n / i; if (a[0] > 1 && a[a[0] - 1] == a[a[0]]) a[0]--;}void solve() { fac[0] = 1; for (int i=1; i <= col; i++) fac[i] = fac[i - 1] * i % P; for (int i=1; i <= 1000; i++) { int t = phi[i] = i; for (int j=2; j * j <= t; j++) if (t % j == 0) { phi[i] = phi[i] / j * (j - 1); while (t % j == 0) t /= j; } if (t > 1) phi[i] = phi[i] / t * (t - 1); } find(A, a); find(B, b); find(C, c); find(D, d); for (int i=1; i <= cnt; i++) { ll tans = 0; for (int ai=1; ai <= a[0]; ai++) for (int bi=1; bi <= b[0]; bi++) for (int ci=1; ci <= c[0]; ci++) for (int di=1; di <= d[0]; di++) l = lcm(lcm(a[ai], b[bi]), lcm(c[ci], d[di])), tans = (tans + (ll)phi[a[ai]] * phi[b[bi]] % P * phi[c[ci]] % P * phi[d[di]] % P * pow(calc(l, i), (ll)A * B * C * D / l)) % P; for (int j=1; j <= col; j++) tans = tans * pow(pow(j, sp[i][j]) * fac[sp[i][j]] % P, P - 2) % P; ans = (ans + tans * fac[col]) % P; } ans = ans * pow((ll)fac[col] * A % P * B % P * C % P * D % P, P - 2) % P; printf("%lld\n",ans);}int main() { scanf("%d%d%d%d%d",&A,&B,&C,&D,&col); dfs(1, col, 1); solve(); return 0;}
阅读全文
1 0
- 日常训练 20160601 B君的关系 羊毛 (Wolle) Burnside
- 日常训练 20170602 B君的教育
- burnside引理和polya定理的各种关系
- 日常训练 Idiot 的方程
- 日常训练 Idiot 的集合
- [日常训练] 树上的游戏
- [日常训练] CZA的蛋糕
- [日常训练] tty的方程
- 日常训练20161013 棋盘上的象
- 日常训练 20170628 神奇的玩具
- 最近的羊毛记录下
- B与b的关系
- 圣诞薅羊毛的那些事
- HEU日常训练10.02
- 日常训练小结
- 日常训练20161012 道路网
- 日常训练20161012 醉酒
- 日常训练20161014 跟踪
- bzoj 3622: 已经没有什么好害怕的了 dp+容斥原理
- SVM代码实现非线性分类
- VideoFrame的编码,发送流(一)
- 棋盘 (省队集训 网(du)络(liu)流(ti))
- Hadoop 学习1
- 日常训练 20160601 B君的关系 羊毛 (Wolle) Burnside
- 欢迎使用CSDN-markdown编辑器
- leetcode136题解
- 动态加载表格数据,自动增加tr td
- 2017浙工大之江学院校赛D-数学||矩阵快速幂
- Python学习笔记02-列表与操作列表
- Android应用开发之所有动画使用详解
- H
- 20170602心情总结