经典的有限制条件的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. Contoso 大学 - 9 - 实现仓储和工作单元模式

    原文 Contoso 大学 - 9 - 实现仓储和工作单元模式 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Micros ...

  2. HOWTO: Be more productive

    ---by   Aaron Swartz HOWTO: Be more productive “With all the time you spend watching TV,” he tells m ...

  3. .NET的JSNO 序列化跟反序列化

    由于本人最近在写webservice,之前一直都同通过AJAX,在服务端处理业务,但是最近需要写一些接口给其他人用,需要使用jsno的序列化与反序列化,什么是jsno就不多说,jsno的好处也不多说, ...

  4. Oracle工程师技能树

    整理了份Oracle工程师的技能树,方便大家在学习的过程中有个大体方向. 欢迎提意见,可以随时更新. 源文件链接地址点此 图片如下: 多媒体插件如下:

  5. 关于 angular 小心得

    心得1: //控制器里面的代码会晚一些执行 setTimeout(function(){ //获取对象的scope var ele = document.querySelector('[ng-cont ...

  6. Eclipse经验总结

    1.在Project Explorer中显示src.resource目录:通过Project->properties->java Build Path->Source设置 2.解决J ...

  7. WCF 初识(一)

    WCF的前世今生 在.NETFramework 2.0以及前版本中,微软发展了Web Service(SOAP with HTTP communication),.NET Remoting(TCP/H ...

  8. discuz管理中心无法登陆

    检查下配置文件,当前管理是不是创始人. 如是,那试下修改数据库,在数据表出错时也会这样,还有一个也同时试下 \config\config_global.php 文件 $_config['admincp ...

  9. php学习日志(2)-php变量

    变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变量(例如:$x=$y+$z).变量的定义主要有以下规则: 变量以$开始,后面跟着变量的名称: 变量名 ...

  10. ics OverbyteIcsHttpProt

    else begin { V7.05 begin } if (FRequestType = httpPOST) or (FRequestType = httpPUT) then begin {$IFD ...