POJ 2888 Magic Bracelet(burnside引理+矩阵)
题意:一个长度为n的项链,m种颜色染色每个珠子。一些限制给出有些颜色珠子不能相邻。旋转后相同视为相同。有多少种不同的项链?
思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置换个数,然后乘以(n/i)的欧拉函数加到ans上面,然后再让ans乘以n在模p下的逆元。至于怎么求因数i下的不变置换个数,相信大家都做过没有限制的,至于有限制的,大家可以考虑一下这样:初始数组a[m][m]都为1,对于每个限制x,y,都令a[x][y]=a[y][x]=0,我们有一个数列:b1,b2,b3,b4...bm,那么对于每个i∈[1,m-1],都有a[bi][bi+1]=1,这样想到了什么?就是矩阵乘法,对于刚刚的矩阵a我们让s=a^i,然后把每个a[i][i]加起来,这样就代表:每个i出发又回到i的方法数,这样就变成因数i下的不变置换个数了!
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
const int Mod=;
int a[][],b[][],c[][],s[][],n,m,K;
int read(){
char ch=getchar();
int t=,f=;
while (ch<''||ch>''){
if (ch=='-') f=-;
ch=getchar();
}
while (''<=ch&&ch<=''){
t=t*+ch-'';
ch=getchar();
}
return t*f;
}
void exgcd(int a,int b,int &x,int &y){
if (b==){
x=;
y=;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=(t-a/b*y);
}
int inv(int n){
int A,B,x,y;
A=n;B=Mod;
exgcd(A,B,x,y);
return (x+Mod)%Mod;
}
int euler(int n){
int res=n,a=n;
for (int i=;i*i<=n;i++)
if (a%i==){
res=res/i*(i-);
while (a%i==) a/=i;
}
if (a>) res=res/a*(a-);
return res%Mod;
}
void mult_matrix1(){
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
c[i][j]=;
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
for (int k=;k<=m;k++)
c[i][j]=(c[i][j]+s[i][k]*b[k][j])%Mod;
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
s[i][j]=c[i][j];
}
void mult_matrix2(){
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
c[i][j]=;
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
for (int k=;k<=m;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j])%Mod;
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
b[i][j]=c[i][j];
}
int work(int x){
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
b[i][j]=a[i][j],s[i][j]=;
int ans=;
for (int i=;i<=m;i++)
s[i][i]=;
while (x){
if (x%) mult_matrix1();
mult_matrix2();
x/=;
}
for (int i=;i<=m;i++) ans=(ans+s[i][i])%Mod;
return ans;
}
int main(){
int T=read();
while (T--){
n=read();m=read();K=read();
for (int i=;i<=m;i++)
for (int j=;j<=m;j++)
a[i][j]=;
for (int i=;i<=K;i++){
int x=read(),y=read();
a[x][y]=a[y][x]=;
}
int ans=;
for (int i=;i*i<=n;i++)
if (n%i==){
ans=(ans+work(i)*euler(n/i))%Mod;
if (i*i!=n)
ans=(ans+work(n/i)*euler(i))%Mod;
}
ans=(ans*inv(n%Mod))%Mod;
printf("%d\n",ans);
}
}
POJ 2888 Magic Bracelet(burnside引理+矩阵)的更多相关文章
- POJ 2888 Magic Bracelet ——Burnside引理
[题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...
- 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 ...
- 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法
[POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...
- poj 2888 Magic Bracelet
经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...
- 解题:POJ 2888 Magic Bracelet
题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...
- [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]
也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...
- POJ 2888 Magic Bracelet [Polya 矩阵乘法]
传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...
- poj 2888 Magic Bracelet <polya定理>
题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...
随机推荐
- FJ省队集训DAY1 T1
题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...
- CMAKE 生成VS2008静态库工程 与 CMAKE使用,CMakeLists.txt编写总结
cmake -G"Visual Studio 9 2008 Win64" 以上命令得用cd命令切换到顶层CMakeLists.txt的当前目录,才能生效 以下是CMakeLists ...
- windows下的用户态调试的底层与上层实现
操作系统:windows XP 调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程.这 ...
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...
- BZOJ3713: [PA2014]Iloczyn
3713: [PA2014]Iloczyn Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 206 Solved: 112[Submit][Status ...
- 读书笔记:java并发
java中主要的同步机制是关键字synchronized,它提供一种独占锁,但是 同步这个术语还包括validate类型的变量,显示锁(Explicit Lock)以及原子变量. -------显示锁 ...
- hdu 5313 Bipartite Graph(dfs染色 或者 并查集)
Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants ...
- hdu 5410 CRB and His Birthday(混合背包)
Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...
- stardict词典(星际译王)
sudo apt-get install stardict 下载词库: http://abloz.com/huzheng/stardict-dic/zh_CN/ 把下载的压缩包解压,以a为例cd /u ...
- 详细介绍如何使用kindEditor编辑器
今天群里的朋友问我能不能写个kindEditor编辑器的使用教程,说是弄了半天没有搞定.由于PHP啦后台正好用了这个编辑器,我有写经验,正好教他的同时写出来分享给大家. kindEditor编辑器是一 ...