经典的有限制条件的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. 如何找出MySQL数据库中的低效SQL语句

    面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我 ...

  2. Cocos2d-x中触摸事件

    理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的“按下”.“移动”和“抬起”等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态 ...

  3. EF查询生成的SQL

    在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL. using (var context = new TestDBEntities()) { ...

  4. OC5_类别

    // // NSString+Reverse.h // OC5_类别 // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 ...

  5. (转)使用 Advanced Installer 打包 一键安装Web应用程序

      使用 Advanced Installer 打包 一键安装Web应用程序         安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置 ...

  6. strlen() 和 strcpy()函数

    strlen() 和 strcpy()函数的区别,这两个一个是返回一个C风格字符串的长度,一个是对一个C风格字符串的拷贝,两个本来功能上是不同的,此外,他们还有一些细小的区别:strlen(" ...

  7. 重回cnblogs

    毕业一年,关于工作的想法和思路渐渐充实,是时候回到cnblogs,开始写技术日志了.

  8. Poj 3062 Celebrity jeopardy

    1.Link: http://poj.org/problem?id=3062 2.Content: Celebrity jeopardy Time Limit: 1000MS   Memory Lim ...

  9. Nodejs加密php解密

    var crypto = require('crypto'); function decode(cryptkey, iv, secretdata) { var decipher = crypto.cr ...

  10. android 获取手机号

    android 获取手机号码,由于运营商的管理方式的不同,所以获取手机号码的方式也可能完全相同.现在很多运营商并不会把手机号码存入sim卡中. 最简单的,比如说中国移动并不将手机号保存在sim卡中,只 ...