【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 ...
随机推荐
- 【WP8】富文本功能实现
2014年8月1日更新:修复如果有多个相同链接解析失败的Bug,谢谢 @Walsh 提供的问题 富文本在移动APP上应用的最多的就是表情了,类似微博,QQ,微信都有对提供对表情和链接的支持,富文本一般 ...
- DEFINE_PER_CPU,如何实现“数组”
引述自:http://www.unixresources.net/linux/clf/linuxK/archive/00/00/47/91/479165.html Kevin.Liu 的<调度器 ...
- kafka学习之-java api测试
1.配置 package com.storm.storm_my.kafka; /** * * @author Peng.Li * */ public class KafkaConfigApiConst ...
- Linux下修改MySql的root密码
linux下如何修改Mysql的root密码 今天,忘了mysql下的root密码,想重置一下,但找了多个网站上的方法均有问题,最后参考几家的过程,经过不断尝试获得,终于成功了,下面特将过程分 ...
- 最简单安装laravel
http://laravelacademy.org/resources-download
- [SLAM] Little about SLAM
Books from Zhihu: 幽默一把 看完Gonzalez:嗯,好像很好玩的样子,我也来搞一搞.看完Price:什么鬼,怎么这么多公式,公式看不懂肿么破.看完Szeliski:原来用一千页的书 ...
- WPF送走控件的focus方法
我们可以调用Focus()方法,让WPF控件获得焦点, 那我现在不想要焦点了, 如何把这个包袱抛出去? 可以, 恩, 没有Unfocus(), 但下面的方法也许可行(把焦点抛给另一个不知道的控件): ...
- ice服务初探
http://masterkey.iteye.com/blog/182975 http://blog.csdn.net/moxiaomomo/article/details/6773979 http: ...
- VS2017编译Poco1.9.0的64版本
需要先准备好OpenSSL1.0.2 下载poco-poco-1.9.0-release.zip,解压,修改buildwin.cmd中的OPENSSL_DIR路径,特别注意OPENSSL_LIB的路径 ...
- transformClassesWithJarMergingForDebug
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.> com.android.build ...