解题:POJ 2888 Magic Bracelet
这题虽然很老了但是挺好的
仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案。
思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的路径计数问题,这里可以多矩乘一次然后统计对角线,即强行让它走回一开始的珠子,比较方便
注:这代码T了,我不想卡了,但是复杂度和正确性没问题,请根据自己的情况食用
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int mod=;
- int T,n,m,k,t1,t2,mapp[][];
- struct a
- {
- int mat[][];
- void Clean()
- {
- memset(mat,,sizeof mat);
- }
- void Init()
- {
- for(int i=;i<=m;i++)
- for(int j=;j<=m;j++)
- mat[i][j]=mapp[i][j];
- }
- };
- a Matime(a x,a y)
- {
- a ret; ret.Clean();
- for(int i=;i<=m;i++)
- for(int k=;k<=m;k++)
- for(int j=;j<=m;j++)
- ret.mat[i][j]+=x.mat[i][k]*y.mat[k][j]%mod,ret.mat[i][j]%=mod;
- return ret;
- }
- a Maqpow(a x,int k)
- {
- if(k==) return x;
- a tmp=Maqpow(x,k/);
- return k%?Matime(x,Matime(tmp,tmp)):Matime(tmp,tmp);
- }
- int Calc(int x)
- {
- a cal; int ret=;
- cal.Init(),cal=Maqpow(cal,x);
- for(int i=;i<=m;i++)
- ret+=cal.mat[i][i],ret%=mod;
- return ret;
- }
- int Phi(int x)
- {
- int ret=x;
- for(int i=;i*i<=x;i++)
- if(x%i==)
- {
- ret/=i,ret*=i-;
- while(x%i==) x/=i;
- }
- if(x!=) ret/=x,ret*=x-;
- return ret;
- }
- void exGCD(int a,int b,int &x,int &y)
- {
- if(!b) x=,y=;
- else exGCD(b,a%b,y,x),y-=a/b*x;
- }
- int Inv(int x)
- {
- int xx,yy;
- exGCD(x,mod,xx,yy);
- return (xx%mod+mod)%mod;
- }
- int Solve(int x)
- {
- int ret=;
- for(int i=;i*i<=x;i++)
- if(x%i==)
- {
- ret+=Phi(x/i)*Calc(i)%mod,ret%=mod;
- if(i*i!=x) ret+=Phi(i)*Calc(x/i)%mod,ret%=mod;
- }
- return ret*Inv(x)%mod;
- }
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d%d",&n,&m,&k);
- for(int i=;i<=m;i++)
- for(int j=;j<=m;j++)
- mapp[i][j]=;
- for(int i=;i<=k;i++)
- {
- scanf("%d%d",&t1,&t2);
- mapp[t1][t2]=mapp[t2][t1]=;
- }
- printf("%d\n",Solve(n));
- }
- return ;
- }
解题:POJ 2888 Magic Bracelet的更多相关文章
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 3731 Accepted: 1227 D ...
- poj 2888 Magic Bracelet <polya定理>
题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...
- poj 2888 Magic Bracelet
经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...
- POJ 2888 Magic Bracelet(burnside引理+矩阵)
题意:一个长度为n的项链,m种颜色染色每个珠子.一些限制给出有些颜色珠子不能相邻.旋转后相同视为相同.有多少种不同的项链? 思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置 ...
- POJ 2888 Magic Bracelet [Polya 矩阵乘法]
传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...
- POJ 2888 Magic Bracelet ——Burnside引理
[题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...
- [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]
也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...
- 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法
[POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...
随机推荐
- DotNetCore部署(IIS)踩坑记
一.windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法 错误现象如图 因为 ...
- CS50.4
1, PDF,portable document format 便携式文档格式 2, 关于文本编辑器(文字编辑器)和文档编辑器(文字处理器),前者可用来写程序的源代码?名字挺难分辨的. *3, “-o ...
- jqGrid 列内容超过一定长度省略表示
jqgrid初始化方法中的,对应列添加formatter方法 colNames : [ "描述" ], colModel : [ { name : 'description', i ...
- python+Selenium 环境搭建
一.下载相关软件 1.python http://python.org/getit/ 2.setuptools http://pypi.python.org/pypi/setuptools 3.pip ...
- 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)
目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...
- PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- Linux第七周学习总结——可执行程序的装载
Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...
- Linux内核分析第四周总结
用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...
- c# WndProc事件 消息类型
转载:https://www.cnblogs.com/idben/p/3783997.html WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_D ...
- 冲刺Two之站立会议2
今天我们进行了主界面部分的设置,因为它包含的部分有很多,所以就只能它拆分进行一一突破.今天主要完成了主界面的框架搭建,以及添加了需要的按钮,包括好友管理,退出登录,开启聊天通信界面的内容等.