题意

用K个颜色给魔方染色,魔方只能整体旋转并且旋转重合的方案算一种,求一共有多少不同的染色方案。

思路

经典的Polya应用,记住正六面体的置换群就可以了,魔方就是每个大面变成9个小面了而已:

本题模型共有4大类置换,共24种:

1. 不做任何旋转 K ^ (54 + 12 + 8)

2. 绕相对面中心的轴转

1) 90度 K ^ (15 + 3 + 2) * 3

1) 180度 K ^ (28 + 6 + 4) * 3

1) 270度 K ^ (15 + 3 + 2) * 3

3. 绕相对棱中心的轴转

1) 180度 K ^ (27 + 7 + 4) * 6

4. 绕相对顶点的轴转

1) 120度 K ^ (18 + 4 + 4) * 4

1) 240度 K ^ (18 + 4 + 4) * 4

然后直接套公式即可~

哦还有一点需要注意的是(A/B) % C = A % (B*C) / C。大部分人是把除法转化为模逆元的乘法,反正我是不懂……

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;

int res;
const int mod = 10007 * 24;
int powi(int n, int p){
int res = 1;
for (int i = 1; i <= p; i ++){
res = res * n % mod;
}
return res;
}

int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int t, k;
scanf("%d", &t);
for (int i = 1; i <= t; i ++){
scanf("%d", &k);
res = (powi(k, 74) + 6 * powi(k, 20) + 3 * powi(k, 38) + 6 * powi(k, 38) + 8 * powi(k, 26)) % mod;
res /= 24;
printf("Case %d: %d\n", i, res);
}
return 0;
}
[/cpp]

最新文章

  1. SU suxcontour命令学习
  2. iOS 关于nil和Nil及null与&lt;null&gt;的区别
  3. mysql常用知识点
  4. C# ACM poj1006
  5. 一个分门别列介绍JavaScript各种常用工具的脑图
  6. OC中的SEL解析
  7. 利用cocoapods创建基于git的私有库
  8. Android初级教程对大量数据的做分页处理理论知识
  9. 企业IT管理员IE11升级指南【8】—— Win7 IE8和Win7 IE11对比
  10. Django admin组件使用
  11. Node.js基础学习二之POST请求
  12. javascript条件语句
  13. Golang之发送消息至kafka
  14. Linux常用基本命令[find]用法(1)
  15. 转载 http://blog.csdn.net/dengta_snowwhite/article/details/6418384
  16. 【Linux】nl命令
  17. mysql 字符集研究
  18. linux文件编程----系统调用
  19. LeetCode——Edit Distance
  20. Python学习系列-----第二章 操作符与表达式

热门文章

  1. Hibernate的状态,缓存和映射
  2. python的tqdm模块
  3. 自旋锁原理及java自旋锁
  4. C#基础整理(二)
  5. JDBC NOTE
  6. Mail.Ru Cup 2018 Round 1
  7. Redis快速入门之简介
  8. 随机生成气泡碰撞(原生js)
  9. c++第二十天
  10. FromBottomToTop团队项目总结