【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法
【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引理+欧拉函数+矩阵乘法的更多相关文章
- POJ 2888 Magic Bracelet ——Burnside引理
[题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...
- POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...
- 欧拉函数 and 大数欧拉 (初步)
前两天总结了素数筛法,其中就有Eular筛法.现在他又来了→→ φ(n),一般被称为欧拉函数.其定义为:小于n的正整数中与n互质的数的个数. 毕竟是伟大的数学家,所以以他名字命名的东西很多辣. 对于φ ...
- 欧拉函数&&欧拉定理
定义和简单性质 欧拉函数在OI中是个非常重要的东西,不知道的话会吃大亏的. 欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数. 对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1 ...
- 欧拉函数&欧拉定理&降幂 总结
欧拉函数&欧拉定理&降幂 总结 标签:数学方法--数论 阅读体验:https://zybuluo.com/Junlier/note/1300214 这年头不总结一下是真的容易忘,老了老 ...
- 欧拉函数线性求解以及莫比乌斯反演(Mobius)
前言 咕咕了好久终于来学习莫反了 要不是不让在机房谁会发现数学一本通上有这么神奇的东西 就是没有性质的证明 然后花了两节数学课证明了一遍 舒服- 前置知识:欧拉函数,二项式定理(组合数) 会欧拉函数的 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
随机推荐
- php过滤字段htmlentities,htmlspecialchars,strip_tags
1.strip_tags:过滤html标签比如<a> <html> <script> 如: $str = '<a href="test.html&q ...
- Thinkphp5笔记七:设置错误页面②
更加完美的去设置错误页面. 一.准备一个错误页面 error.html,位置:thinkphp\template\index\default\error.html ,准备把前段所有的错误提示都指向这里 ...
- UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
lienhua342014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 ...
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...
- BarTender条码检验位类型知识讲解
检验位类型指定BarTender使用哪一种算法来计算符号的附加检验位.使用“BarTender检验位类型”选项可以从您的符号所支持的检验位类型中选择一种检验位类型.下面,小编就给大家分享设置检验位类型 ...
- 关于修改linux hostname的问题,尤其是redhat 7修改hostname的方式
http://blog.csdn.net/the_conquer_zzy/article/details/68064149
- %s %d %f 等等是什么意思
这个是C语言的格式化输出:%s是字符串.%d是整数.%f代表浮点数. 这些是格式声明,格式声明由“%”和格式字符组成.常用的格式字符有:1)d格式符,用来输出一个有符号的十进制整数:2)c格式符,用来 ...
- 项目管理PMP输入输出ITTO联系记忆
综述九大领域 项目管理的输入输出非常难记,原因在于理解起来也经不去推敲,故整理一个联想记忆版本,通过联想把输入输出都串起来达到记忆的目的,既然是联想,里面的内容逻辑只是为了好记,并无正确与否,请大家原 ...
- Dubbo 实例
POM: <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifact ...
- ajax访问WebService跨域问题
1.先看一个网站介绍,了解跨域问题 HTTP访问控制(CORS) 2.像谷歌.火狐浏览器对一些非简单请求会触发预检请求,首先使用 OPTIONS 方法发起一个预检请求到服务器,然而IE浏览器 ...