【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

转载于:https://www.cnblogs.com/CQzhangyu/p/8227388.html

【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法相关推荐

  1. POJ 2888 Magic Bracelet ——Burnside引理

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

  2. [POJ2888] Magic Bracelet

    [POJ2888] Magic Bracelet 题目描述 简要题意:给圆上个点染色,颜色有种,其中对颜色不能相邻,循环同构,多组数据,询问染色方案数. Solution 大概就是一道挺显然的Burn ...

  3. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  4. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  5. 从欧拉函数、欧拉定理到RSA加解密

    古希腊哲学家苏格拉底曾言:"我唯一知道的就是我一无所知.": 中国儒家学派创始人孔子曰:"知之为知之,不知为不知,是知也.": 德国著名数学家希尔伯特则满怀信心 ...

  6. poj2154-color-polyan次二面体+欧拉函数优化

    N<=1e9,O(nlogn)的做法会超时.从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) 1 /*-------------------------- ...

  7. hdu 1286( 欧拉函数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286 数学题真的是有点吃不消了... View Code 1 #include<iostream ...

  8. 费马定理中值定理_数论-欧拉函数、欧拉定理

    欧拉函数 积性函数 满足 ( 互质) 定义 对于正整数 ,欧拉函数是小于等于 的所有数中与 互质的数的 个数. 欧拉函数是积性函数(这个证明不是很显然,这个链接里面有很多种证明方法) 记作: 公式 , ...

  9. poj2154(Polya+欧拉函数优化模版)

    #include <cstdio> #include <cstring> #include<iostream> using namespace std; const ...

  10. 【数学专题】约数个数与欧拉函数

    整理的算法模板合集: ACM模板 目录 一.约数个数 1. AcWing 1291. 轻拍牛头 2. AcWing 1294. 樱花 2.1 AcWing 197. 阶乘分解 3. AcWing 19 ...

最新文章

  1. nurbs建模能用MATLAB么,NURBS(matlab生成nurbs曲线图像)
  2. python3.7.2使用-centos7系统下python2与python3共存
  3. 综艺节目php灭灯_非诚勿扰php程序员 结果遭女嘉宾瞬间全灭灯
  4. 计算机网络:TCP和UDP的对比
  5. obs多推流地址_苹果手机IOS系统:抖音+易推流直播手机游戏——墨涩网
  6. asp net服务器虚拟路径,asp.net获取服务器虚拟路径
  7. python画三维图-Python 绘制酷炫的三维图步骤详解
  8. input:hidden的作用
  9. 汉字编码及区位码查询算法
  10. grads插值_GrADs常用函数
  11. Google 企业域名邮箱注册地址
  12. linux进程sl是什么,Linux ps state sl+是什么意思
  13. keil 调试指针不跳转 0x00000000 0000 MOVS r0,r0 解决方案
  14. 揭示模式(Revealing Module)
  15. 虐心的《西部世界》第二季:我看哭了 人类和AI傻傻分不清
  16. 群体结构分析:用 phylip 构建进化树
  17. java最简单的代码
  18. gyp: No Xcode or CLT version detected!问题解决
  19. weka 执行结果MySQL_WEKA数据解析实验.doc
  20. db2 使用db2pd 进行监视和故障诊断

热门文章

  1. 无约束最优化(一) 最速下降法、Newton法、修正Newton法
  2. IP通信基础 3月6日
  3. freeswitch 一些坑
  4. BZOJ1468Tree——点分治
  5. Rabbit MQ 安装
  6. 55)函数指针和其意义
  7. P3512 [POI2010]PIL-Pilots
  8. 大二下周总结(14)
  9. v8:: fatalProcessOutOfMemory
  10. 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)