经典的有限制条件的Burnside计数+矩阵乘法!!!

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

那么array[a][b] = array[b][a] = 0;
对于具有n/L个循环节的置换(L为每个循环节的长度)。先求出array[][]的n/L次幂,然后将这个矩阵的array[i][i]
(1<=i<=m)全部加起来即为这种置换下涂色不变的方法数。

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 50000
using namespace std;
int m,mod=,cnt,prime[];
bool f[];
struct Matrix
{
int a[][];
};
Matrix Mul(Matrix A,Matrix B)
{
Matrix ans;
for(int i=;i<m;i++)
for(int j=;j<m;j++){
ans.a[i][j] = ;
for(int k=;k<m;k++)
{
if (A.a[i][k] && B.a[k][j])
ans.a[i][j] = ans.a[i][j]+A.a[i][k]*B.a[k][j];
}
ans.a[i][j]%=mod;//一定要在这里去摸,否则会超时的
}
return ans;
}
int pows(Matrix A,int b)
{
int i,j,re=;
Matrix ans;
for(i=;i<m;i++)
for(j=;j<m;j++)
ans.a[i][j]=(i==j);
while(b){
if (b&) ans = Mul(A,ans);
b>>=;
A = Mul(A,A);
}
for (i=;i<m;i++)
re = (re+ans.a[i][i])%mod;
return re;
}
int Euler(int n)
{
int ans = n;
for (int i=;i*i<=n;i++){
if (n%i==){
ans=(ans/i)*(i-);
n/=i;
while(n%i==)
n/=i;
}
}
if(n>) ans=(ans/n)*(n-);
return ans%mod;
}
int mypow(int a,int b)
{
int ans = ;
while(b){
if (b&) ans = (ans*a)%mod;
b>>=;
a=(a*a)%mod;
}
return ans;
}
int main(){
int i,n,sum,t,aa,bb,k,j;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
Matrix p;
for(i=;i<m;i++)
for(j=;j<m;j++)
p.a[i][j]=;
for(i=;i<k;i++){
scanf("%d%d",&aa,&bb);
p.a[aa-][bb-]=p.a[bb-][aa-]=;
}
sum = ;
for(i=;i*i<=n;i++){
if(n%i==){
sum = (sum+pows(p,i)*Euler(n/i))%mod;
if(i*i!=n)
sum = (sum+pows(p,n/i)*Euler(i))%mod;
}
}
int x=mypow(n%mod,mod-);
sum = (sum*x)%mod;
printf("%d\n",sum);
}
return ;
}

poj 2888 Magic Bracelet的更多相关文章

  1. poj 2888 Magic Bracelet <polya定理>

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

  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[Polya Burnside 置换 矩阵]

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

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

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

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

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

  6. 解题:POJ 2888 Magic Bracelet

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

  7. POJ 2888 Magic Bracelet(burnside引理+矩阵)

    题意:一个长度为n的项链,m种颜色染色每个珠子.一些限制给出有些颜色珠子不能相邻.旋转后相同视为相同.有多少种不同的项链? 思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置 ...

  8. POJ 2888 Magic Bracelet ——Burnside引理

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

  9. poj 2154 Color【polya定理+欧拉函数】

    根据polya定理,答案应该是 \[ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} \] 但是这个显然不能直接求,因为n是1e9级别的,所以推一波式子: \[ \frac ...

随机推荐

  1. Oracle 简介 三层结构

    引言: 主流数据库:sql server, oracle, my sql,IBM公司的DB2 ,oracle占有量很大 dbms(database management system)数据库管理系统 ...

  2. pl/sql developer 中文字段显示乱码

    在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样 ...

  3. bzoj 1005 HNOI2008 明明的烦恼

    这题做的我欲哭无泪啊…… 我已经没心情多说啥了…… 高精度T啊!我太弱啊!改了一天啊!还不如滚粗啊! 想好式子在写啊! 能用高精度乘单精度就不要用高精度乘高精度啊!     能用高精度除单精度就不要用 ...

  4. PHP 魔术方法(所有的魔术方法)

    慢慢长寻夜,明月高空挂. 目前PHP所有的魔术方法有一下这些 __construct() __destruct() __call() __callStatic() __get() __set() __ ...

  5. 指针之 *((volatile unsigned long *)(x))解析

    今天重新温习了一下C语言的指针部分,突然想到了经常会碰见的一种宏定义:#define PGAS (*((volatile unsinged long *)(x))) 在解析该宏定义前,先看看指针变量的 ...

  6. Mysql MyISAM数据库批量转换表引擎为Innodb

    Mysql MyISAM数据库批量转换表引擎为Innodb 最近在做事物处理需要把表结构都改为带有支持事物的Innodb引擎格式, 把里面数据库 用户名.密码 等信息修改为你自己的,放在网站下运行即可 ...

  7. linux命令之ps命令

    1.管道 linux命令管道通过|表示.一般在linux命令中|(管道)之前的命令会输出大量的结果,|(管道)之后的命令一般就是带有条件的,只将|前满足条件的结果显示出来. 2.grep命令 grep ...

  8. mongo数据库基础操作

    概念 一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binar ...

  9. sublime 编辑完自动生成tmp的备份

    是安装phptool之后造成的,卸载即可 http://bbs.csdn.net/topics/390826865

  10. dapper 写查询sql 时,多条件参数操作方法

    var args = new DynamicParameters(new {}); if (obj.orderId != null) { sb.Append(" AND OrderId = ...