【POJ2888】Magic Bracelet

题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种。如果一个项链在旋转后与另一个项链相同,则认为这两串珠子是相同的。

$n\le 10^9,m\le 10,k\le \frac{m(m-1)} 2 $

题解:好题。

依旧回顾从Burnside引理到Pólya定理的推导过程。一个置换中的不动点要满足它的所有循环中的点颜色都相同,那么在旋转i次的置换中,循环有gcd(i,n)个,我们规定这些循环的起始点是1,2,...gcd(i,n),由于1,1+i,1+2i...的颜色都与i是一样的,那么我们其实只需要考虑1到gcd(i,n)这段的染色方案数即可。如何统计呢?矩阵乘法!

但是枚举i仍然是行不通的,但我们可以考虑枚举d=gcd(i,n),有多少个i满足gcd(i,n)=d呢?显然是$\varphi({n\over d})$!所以DFS所有n的约数即可。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int P=9973;
int n,m,K,mx,tot,ans;
struct M
{
int v[12][12];
int * operator [] (const int &a) {return v[a];}
M () {memset(v,0,sizeof(v));}
M operator * (const M &a) const
{
M b;
int i,j,k;
for(i=1;i<=m;i++) for(j=1;j<=m;j++) for(k=1;k<=m;k++) b.v[i][j]=(b.v[i][j]+v[i][k]*a.v[k][j])%P;
return b;
}
}S,T[33];
int cnt[20],p[20];
inline int pm(int x,int y)
{
int z=1;
x%=P;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
inline void PM(int y)
{
for(int i=mx;i>=0;i--) if(y>=(1<<i)) S=S*T[i],y-=1<<i;
}
void dfs(int x,int d,int phi)
{
if(x>tot)
{
memset(S.v,0,sizeof(S.v));
int i,j;
for(i=1;i<=m;i++) S[i][i]=1;
PM(d-1);
for(i=1;i<=m;i++) for(j=1;j<=m;j++) if(T[0][i][j]) ans=(ans+phi%P*S[i][j])%P;
return ;
}
int i;
dfs(x+1,d,phi);
for(i=1;i<cnt[x];i++) d*=p[x],phi/=p[x],dfs(x+1,d,phi);
d*=p[x],phi/=(p[x]-1),dfs(x+1,d,phi);
}
void work()
{
scanf("%d%d%d",&n,&m,&K);
ans=tot=0;
int i,j,a,b,t=n,phi=1;
for(i=1;i<=m;i++) for(j=1;j<=m;j++) T[0][i][j]=1;
for(i=1;i<=K;i++)
{
scanf("%d%d",&a,&b);
T[0][a][b]=T[0][b][a]=0;
}
for(mx=0,i=1;(1<<i)<=n;mx=i++) T[i]=T[i-1]*T[i-1];
for(i=2;i*i<=t;i++) if(t%i==0)
{
p[++tot]=i,cnt[tot]=1,phi*=i-1,t/=i;
while(t%i==0) cnt[tot]++,phi*=i,t/=i;
}
if(t>1) p[++tot]=t,cnt[tot]=1,phi*=t-1;
dfs(1,1,phi);
printf("%d\n",ans*pm(n,P-2)%P);
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--) work();
return 0;
}//4 3 2 0 3 2 1 1 2 3 2 2 1 1 1 2 3 2 3 1 1 1 2 2 2

【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法的更多相关文章

  1. POJ 2888 Magic Bracelet ——Burnside引理

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

  2. POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)

    Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...

  3. 欧拉函数 and 大数欧拉 (初步)

    前两天总结了素数筛法,其中就有Eular筛法.现在他又来了→→ φ(n),一般被称为欧拉函数.其定义为:小于n的正整数中与n互质的数的个数. 毕竟是伟大的数学家,所以以他名字命名的东西很多辣. 对于φ ...

  4. 欧拉函数&&欧拉定理

    定义和简单性质 欧拉函数在OI中是个非常重要的东西,不知道的话会吃大亏的. 欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数. 对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1 ...

  5. 欧拉函数&欧拉定理&降幂 总结

    欧拉函数&欧拉定理&降幂 总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300214 这年头不总结一下是真的容易忘,老了老 ...

  6. 欧拉函数线性求解以及莫比乌斯反演(Mobius)

    前言 咕咕了好久终于来学习莫反了 要不是不让在机房谁会发现数学一本通上有这么神奇的东西 就是没有性质的证明 然后花了两节数学课证明了一遍 舒服- 前置知识:欧拉函数,二项式定理(组合数) 会欧拉函数的 ...

  7. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  8. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  9. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

随机推荐

  1. DWZ主从表界面唯一性验证(自写js)(二)

    上篇介绍了自写js判断的前三项,本篇博客介绍第四步,关于触发课程代码文本框的离开事件后,判断一整列的课程代码之间是否有重复的值. 此问题可以提取为判断一个数组里是否有重复值,重复值是什么. 第四步→判 ...

  2. greenplum的用法

     gp建表的实例         gp 创建外部表的实例:(外部表不能建立分布键)              CREATE EXTERNAL TABLE user_app_tag (         ...

  3. Unity3D编辑器之重写Hierarchy的右键菜单

    using UnityEngine; using UnityEditor; using System.Collections; public class MyHierarchyMenu { [Menu ...

  4. easyui分页,编辑datagrid某条数据保存以后跳转到某一页

    参考资料:http://caizhilin2010.iteye.com/blog/1731698 问题:商品列表页面采用easyui的datagrid展示数据,编辑某行数据保存以后,要求跳转到 用户在 ...

  5. symfony window下的安装 安装时候出现的问题以及解决方案

    1. cmd进入DOS  , cd 到 php.exe 的目录下 2.         php -r "readfile('http://symfony.com/installer');&q ...

  6. linux避免crontab的执行输出将磁盘目录占满?用户的mail占用大的空间?

    需求描述: 早上设置了ntp客户端的定时任务,发现不断的有You have new mail in /var/spool/mail/root这种提示. 然后,就看了具体的文件,由于ntpdate是每分 ...

  7. Sql server连接数据库报错相关

    情况一:此版本的 SQL Server 不支持用户实例登录标志. 解决方法: 方法1:在连接属性的设置里边,点高级,将User Instance 设置为false,默认的true(我在中没有找到相应的 ...

  8. linux下.so、.ko、.a的区别

    各类文件的区别与作用: 1.对于.so文件 .so文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问. 2.对于.ko文件 .ko文件是内核态的动态链接库,用于内核态的动 ...

  9. SpringBoot------集成PageHelper分页功能

    添加MyBatis的代码,地址 https://www.cnblogs.com/tianhengblogs/p/9537665.html 修改以下部分: 1.添加MyBatisConfig packa ...

  10. cocos2dx 3.0 scrollview 在android下面背景變綠色了

    在windows上面跑的是OK的,  在android下面跑的時候就變成這樣子了: