题目链接
https://nanti.jisuanke.com/t/18515

题面:
The Floppy Cube is essentially a 1 × 3 × 3 Rubik’s Cube. It is made up of 9 identical cubic pieces arranged into a 1 × 3 × 3 cuboid. The puzzle consists of 4 corner pieces, 4 edge pieces and 1 centre piece. Each corner piece has four colours each, each edge piece has three colours each, while the centre piece has two colours (on the opposite faces). The puzzle can be thought of as twisting around its edge pieces. Each twist causes one edge piece to rotate 180 degrees in place, and the two adjacent corner pieces to swap position (while also being rotated). Of course, rotating or flipping the entire Floppy Cube are available moves as well. The purpose of the puzzle is to restore it to the state of having one colour per face.

Suppose that we wish to apply new colour stickers to a Floppy Cube in a colouring which is not necessary to be a standard colouring. Specifically, we have n different colours available (with an unlimited supply of stickers of each colour), and we place one sticker on each of the 30 faces in any arrangement that we please. We are not required to use all the colours, and if desired the same colour may appear in more than one face of a single cubic piece.

We say that two such colouring c1 and c2 are essentially distinct if a cube coloured according to c1 cannot be made to match a cube coloured according to c2 by performing mechanically possible Floppy Cube moves. How many essentially distinct colourings are there with n different colours available?

Input
The input has several test cases, and the first line contains an integer T (1 ≤ T ≤ 22222) which is the total number of test cases. For each case, a line contains two integers n and P where 1 ≤ n, P ≤ 111111111.

Output
For each case, calculate the number of distinct colouring with n different colours available, and output the remainder when it divided by P.

sol:

1.polyapolya polya 裸题 。因为这个变换看起来没有什么性质,无法手推,考虑把所有的置换群找出来,这个用bfs搜或者dfs搜都可以。

2.实际上所有的置换群都可以用三个元操作组合完成,分别是
1) 将最右边的棱进行翻转
2) 顺时针旋转
3) 整体前后翻转

考虑将每个面按如下方法进行标号:
正面和反面:

左面和右边:

上面和下面:

然后就可以大力爆搜啦,直接用 set<vector<int>>set<vector<int>>set > 暴力存好像也没啥问题。

3.找出循环节之后应用polyapolya polya 定理,设 f(G)f(G) f(G) 为置换G的循环节个数,颜色种数为c则有
ans=1n∑ni=1cf(Gi)ans=1n∑i=1ncf(Gi) ans = \frac{1} {n} \sum_{ i= 1}^{n} c^{f(G_i)} 。

4.注意几个细节
1)p不一定为质数,所以不一定有逆元,可以通过对 (n∗P)(n∗P) (n * P) 取模再 除以 nn n 。这可能会超过1e11,所以需要大数或者__128.

code:

#include<bits/stdc++.h>using namespace std;typedef __int128 lll;
typedef long long ll;
const int maxn = 1e5 + 10;#define pb push_back//变换1
int a1[31] = {0,  1,  2, 18,  4,  5, 15,  7,  8, 12, 10,11,  9, 13, 14,  6, 16, 17,  3, 19, 20,22, 21, 23, 24, 25, 26, 27, 30, 29, 28};//变换2
int a2[31] = {0,  7,  4,  1,  8,  5,  2,  9,  6,  3, 16,13, 10, 17, 14, 11, 18, 15, 12, 28, 29,30, 25, 26, 27, 19, 20, 21, 22, 23, 24};//变换3
int a3[31] = {0, 16, 17, 18, 13, 14, 15, 10, 11, 12,  7,8,  9,  4,  5,  6,  1,  2,  3, 24, 23,22, 21, 20, 19, 27, 26, 25, 30, 29, 28};set<vector<int> > sol;
vector<int> turn[4];vector<int> Mul(vector<int>& a,vector<int>& b){vector<int> ret;ret.resize(31);for(int i = 1;i <= 30;i++) ret[i] = b[a[i]];return ret;
}void dfs(vector<int> x){for(int i = 1;i<= 3;i++){vector<int> ret = Mul(x,turn[i]);if(sol.count(ret) == 0){sol.insert(ret);dfs(ret);}}
}unordered_map<int,int> mp;
bool vis[32];void Cal(){mp.clear();for(vector<int> x : sol){memset(vis,false,sizeof(vis));int cnt = 0;for(int i = 1;i<=30;i++){if(!vis[i]){cnt ++;int ret = i;vis[ret] = true;while(!vis[x[ret]]){ret = x[ret];vis[ret] = true;}}}mp[cnt]++;}
}lll qpow(lll a,ll b,lll p){lll ret = 1;while(b){if(b&1) ret = ret * a % p;a = a*a % p;b >>= 1;}return ret;
}#define fi first
#define se secondvoid init(){for(int i = 0;i<= 30;i++){turn[1].push_back(a1[i]);turn[2].push_back(a2[i]);turn[3].push_back(a3[i]);}vector<int> ret;ret.resize(31);for(int i = 0;i<=30;i++) ret[i] = i;sol.insert(ret);dfs(ret);Cal();
}int main(){init();int T;scanf("%d",&T);ll sz = sol.size();// cout<<sz<<endl;while(T--){ll n,p;scanf("%lld%lld",&n,&p);lll ans = 0;for(auto x : mp){lll mod = p;mod *= sz;lll ret = qpow(n,x.fi,mod);ret = ret * x.se % mod;ans += ret;ans %= mod;}ans /= sz;ll out = ans;printf("%lld\n",out);}return 0;
}

顺便放下组队赛的polya题,出题人卡空间卡得有点丧心病狂啊,bfs搜索加Hash去重

题目链接:https://scut.online/p/296

code:

#include<bits/stdc++.h>using namespace std;typedef __int128 lll;
typedef vector<char> vi;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 10;
const int PP = 19260817;#define fi first
#define se secondint n,m;vi Turn[10];
unordered_set<ull> sol;
unordered_map<int,int> ms;vi Mul(vi& a,vi& b){vi ret;ret.resize(n+1);for(int i = 1;i<=n;i++) ret[i] = b[a[i]];return ret;
}ull Hash(vi& x){ull ret = 0;for(int i = 1;i<x.size();i++){ret = ret * PP + x[i];}return ret;
}bool vis[10];void Cal(vi& x){memset(vis,false,sizeof(vis));int cnt = 0;for(int i = 1;i<=n;i++){if(!vis[i]){cnt++;int ret = i;vis[ret] = 1;while(!vis[x[ret]]){ret = x[ret];vis[ret] = 1;}}}ms[cnt]++;
}void BFS(vi x){queue<vi > Q;int maxx = 0;Q.push(x);sol.insert(Hash(x));while(!Q.empty()){vi u = Q.front();Q.pop();maxx = max(maxx,(int)Q.size());Cal(u);for(int i = 1;i<=m;i++){vi ret = Mul(u,Turn[i]);ull tmp = Hash(ret);if(sol.count(tmp) == 0){sol.insert(tmp);Q.push(ret);}}}
}inline void Mul(lll& a,lll b,lll p){a *= b;if(a>=p) a %= p;
}inline void Add(lll& a,lll b,lll p){a += b;if(a>=p) a-= p;
}lll qpow(lll a,ll b,lll p){lll ret = 1;while(b){if(b&1) Mul(ret,a,p);Mul(a,a,p);b >>= 1;}return ret;
}int main(){int T;scanf("%d",&T);while(T--){int C,P;scanf("%d%d%d%d",&n,&m,&C,&P);for(int o = 1; o <= m; o++){int op;scanf("%d",&op);vi& ret = Turn[o];ret.resize(n+1); for(int i = 0;i<=n;i++) ret[i] = i;if(op == 1){int l,r;scanf("%d%d",&l,&r);for(int i = 0;l+i<r-i;i++){swap(ret[l+i],ret[r-i]);}}else {int L1,L2,t;scanf("%d%d%d",&L1,&L2,&t);for(int i = 0;i<t;i++){swap(ret[L1+i],ret[L2+i]);}}}ms.clear();sol.clear();vi ret(n+1);for(int i = 0;i<=n;i++) ret[i] = i;BFS(ret);ll sz = sol.size();lll mod = P;mod *= sz;lll ans = 0;for(auto x : ms){lll ret = qpow(C,x.fi,mod);Mul(ret,x.se,mod);Add(ans,ret,mod);}ans /= sz;ll out = ans;printf("%lld\n",out);}return 0;
}

2017 青岛 E Floppy Cube相关推荐

  1. 青岛科技大学计算机科学与技术排名,2017青岛科技大学在全国排名第几

    2017青岛科技大学在全国排名第几 青岛科技大学是山东省属重点建设的.大学,是一所以工为主,理.工.文.经.管.医.法.艺等学科协调发展,以材料学.化学工程.应用化学.机械工程.自动化.信息与计算机为 ...

  2. 2017青岛计算机报名,【青岛市2017年第二批次计算机应用能力考试报名通知】- 环球网校...

    [摘要]环球网校分享的青岛市2017年第二批次计算机应用能力考试报名通知以下介绍了计算机考试报名通知.报名时间.考试时间等安排,希望对大家有帮助更多资料敬请关注环球职称计算机考试频道,网校会及时更 [ ...

  3. 响铃:国际竞争变标准之争,长袖善舞的海尔这次又走在了前面

    文 | 曾响铃 来源 | 科技向令说(xiangling0815) 众所周知,在经济技术全球化的今天,标准体系已经逐渐成为国际产业发展中的关键因素,谁能主导标准制定,谁就能成为信息时代全球企业竞争的优 ...

  4. 曲线的切线的相关问题

    本专题主要从以下两个方面做以阐述: A.求曲线的切线 类型1.在点处的切线 \(\fbox{例1}\)如函数\(y=x^3\)在点\(A(1,1)\)处(或叙述为在\(x=1\)处)的切线方程为什么? ...

  5. 2021年即墨萃英中学高考成绩查询,2017即墨萃英中学青岛十九中录取分数线发布...

    2017即墨萃英中学青岛十九中录取分数线发布 2017即墨市中考录取分数线发布 优质高中电脑派位 643分 即墨一中  620分 即墨实验高中  628分 即墨萃英中学  620.5分 青岛十九中  ...

  6. 山东青岛电子计算机技校,官方公布 | 青岛市2017年中职技校录取分数线

    原标题:官方公布 | 青岛市2017年中职技校录取分数线 1.今年我市职业学校录取总成绩780分,同分考生按照数学.物理.化学.语文.英语(含听力口语).历史.地理.生物的顺序,依次比对成绩,优先顺序 ...

  7. 青岛滨海学院计算机科学及技,青岛滨海学院计算机科学与技术专业2017年在河南理科高考录取最低分数线...

    类似问题答案 青岛滨海学院计算机科学与技术专业2015年在河南理科高考录取最低分数线 学校 地 区 专业 年份 批次 类型 分数 青岛滨海学院 河南 计算机科学与技术 2015 三批 理科 426 学 ...

  8. 青岛电子学校计算机应用分数,2017年青岛电子学校录取分数线公布

    2017年青岛中考成绩已经公布,青岛中考网第一时间整理发布各批次录取分数线,希望对考生家长所有帮助,下面是<2017年青岛电子学校录取分数线公布>. 1.今年我市职业学校录取总成绩780分 ...

  9. 通知 | 2017年清华-青岛数据科学研究院“RONG”奖学金即将开放申请

    各有关同学: 为促进大数据人才培养,服务国家大数据发展战略,清华-青岛数据科学研究院(简称:数据科学研究院)设立"RONG"奖学金,申请通道将于12月1日开启.奖学金面向全校各院系 ...

最新文章

  1. 种豆得豆,种瓜得瓜 : 你的网络就是一片自留地
  2. 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
  3. 利用计算机进入,1、在第四代计算机期间内,计算机的应用逐步进入到()
  4. hdu 4223 排序
  5. Mac idea中git igenore设置
  6. 云专网和云专线的区别_传统IDC行业与云计算的区别?
  7. 自定义处理网页选区字符并实时显示(js)
  8. 看完这篇垃圾回收,和面试官扯皮没问题了
  9. FPGA _Verilog HDL_计数器实现数字钟60秒计数设计实验
  10. 2000年科技计算机,2000年华中科技大学计算机研究生机试真题 对称矩阵
  11. jpa初学 hibernate学习
  12. 重学前端学习笔记(十三)--浏览器工作解析(三)
  13. 《波斯王子-时之砂》精美图文攻略
  14. linux flash擦除命令,Linux下flash操作读、写、擦除步骤
  15. 中央电大c 语言程序设计本科试题,中央电大本科C语言程序设计A试题2010年7月.doc...
  16. 一个关于Linux Bridge配置的吐嘈
  17. android播放器概述,【Android】 从头搭建视频播放器(1)——概述
  18. 浅谈PHP与Java之Web开发整合技术
  19. 外汇交易提醒:美元三连阴创逾一周新低,欧洲央行或准备更大幅度加息
  20. 设计模式之代理模式、动态代理模式、Cglib代理模式

热门文章

  1. Linux 修改 .bashrc
  2. 细节管理在儿科护理管理中的应用价值研究
  3. android 标签对应的代码怎么写alignParentRight、marginRight
  4. vue项目-商城app
  5. CUDA版本的Locality-aware NMS
  6. L2TP NAS initial中整个交互过程分析
  7. 公积金贷款vs商业贷款
  8. 液体光波导的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. 并查集——你一看就明白就会用
  10. onkeydown,onkeyup,onkeypress,onclick,ondblclick