题意:一个长度为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引理+矩阵)的更多相关文章

  1. POJ 2888 Magic Bracelet ——Burnside引理

    [题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...

  2. poj 2888 Magic Bracelet(Polya+矩阵快速幂)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 4990   Accepted: 1610 D ...

  3. POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 3731   Accepted: 1227 D ...

  4. 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法

    [POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...

  5. poj 2888 Magic Bracelet

    经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...

  6. 解题:POJ 2888 Magic Bracelet

    题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...

  7. [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]

    也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...

  8. POJ 2888 Magic Bracelet [Polya 矩阵乘法]

    传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...

  9. poj 2888 Magic Bracelet <polya定理>

    题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...

随机推荐

  1. RFID电子标签加工的倒装工艺

    倒装对于半导体封装领域的人员而言,是再熟悉不过的了.一般我们看到的集成电路多数以塑封为主,半导体芯片和外界进行信息沟通的通道,靠的就是集成电路的管脚.如果把集成电路外面的封装去掉,会发现每个集成电路内 ...

  2. windows设备驱动安装接口(自己仿写)

    /***************************************** Author:foo_hack This is File named:Setup.h The Funtion Im ...

  3. 【转】 ubuntu12.04更新源 官网和163等

    原文网址:http://blog.csdn.net/zhangliang_571/article/details/8813999 分类: LINUX 摘要: 本文列出ubuntu 12.04 LTS更 ...

  4. Interfaces

    阅读Java的官方Doc,总结如下. What is Interface An interface is a reference type, similar to a class, that can ...

  5. Thinkphp显示系统常量信息的方法(php的用法)

    输入 :public function Main()    {        dump(get_defined_constants(true));    }显示系统信息, 其中: 'APP_PATH' ...

  6. php_mysql、php_mysqli 与 pdo_mysql 的区别与选择

    php与mysql的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案.   ...

  7. HOG(方向梯度直方图)

    结合这周看的论文,我对这周研究的Histogram of oriented gradients(HOG)谈谈自己的理解: HOG descriptors 是应用在计算机视觉和图像处理领域,用于目标检測 ...

  8. 压位加速-poj-2443-Set Operation

    题目链接: http://poj.org/problem?id=2443 题目意思: 有n个集合(n<=1000),每个集合有m个数ai(m<=10000,1=<ai<=100 ...

  9. 利用JConsole工具监控java程序内存和JVM

    一.找到java应用程序对应的进程PI 性能测试应用程序访问地址:http://192.168.29.218:7070/training/ 部署的应用服务器为tomcat6.028 启动tomcat服 ...

  10. mysql 主从复制配置步骤

    1.准备两台数据库环境,或者单台多实例环境,能否正常启动和登录. 2.配置my.cnf文件,主库配置log-bin和server-id参数,从库配置server-id,不能和主库及其他从库一样,一般不 ...