POJ 2888 Magic Bracelet [Polya 矩阵乘法]
题意:竟然扯到哈利波特了....
和上一题差不多,但颜色数很少,给出不能相邻的颜色对
可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了....
感觉这样的环上有限制问题挺套路的...旋转的等价循环个数$t$我们很清楚了,并且环上每$t$个元素各属于不同的循环,我们只要求出$t$个元素满足限制的方案数就能得到$C(f)$了
然后再加上$gcd$取值讨论就降到根号了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+,P=;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,m,k,u,v;
int p[N];
bool notp[N];
void sieve(int n){
for(int i=;i<=n;i++){
if(!notp[i]) p[++p[]]=i;
for(int j=;j<=p[]&&i*p[j]<=n;j++){
notp[i*p[j]]=;
if(i%p[j]==) break;
}
}
}
inline int phi(int n){
int re=n,m=sqrt(n);
for(int i=;i<=p[]&&p[i]<=m&&p[i]<=n;i++) if(n%p[i]==){
re=re/p[i]*(p[i]-);
while(n%p[i]==) n/=p[i];
}
if(n>) re=re/n*(n-);
return re%P;
}
struct Matrix{
int a[][];
int* operator [](int x){return a[x];}
Matrix(){memset(a,,sizeof(a));}
void ini(){for(int i=;i<=;i++) a[i][i]=;}
}a;
Matrix operator *(Matrix a,Matrix b){
Matrix c;
for(int k=;k<=m;k++)
for(int i=;i<=m;i++) if(a[i][k])
for(int j=;j<=m;j++) if(b[k][j])
(c[i][j]+=a[i][k]*b[k][j])%=P;
return c;
}
Matrix operator ^(Matrix a,int b){
Matrix re;re.ini();
for(;b;b>>=,a=a*a)
if(b&) re=re*a;
return re;
}
inline void mod(int &x){if(x>=P) x-=P;}
int f(int x){
Matrix b=a^x;
int re=;
for(int i=;i<=m;i++) mod(re+=b[i][i]);
return re;
}
inline int Pow(int a,int b){
int re=;
a%=P;
for(;b;b>>=,a=a*a%P)
if(b&) re=re*a%P;
return re;
}
inline int Inv(int a){return Pow(a,P-);}
void solve(){
int m=sqrt(n),ans=;
for(int i=;i<=m;i++) if(n%i==){
mod(ans+= f(i)*phi(n/i)%P);
if(i*i!=n) mod(ans+= f(n/i)*phi(i)%P);
}
printf("%d\n",ans*Inv(n)%P);
}
int main(){
freopen("in","r",stdin);
sieve();
int T=read();
while(T--){
n=read();m=read();k=read();
for(int i=;i<=m;i++) for(int j=;j<=m;j++) a[i][j]=;
for(int i=;i<=k;i++){
u=read();v=read();
a[u][v]=a[v][u]=;
}
solve();
}
}
POJ 2888 Magic Bracelet [Polya 矩阵乘法]的更多相关文章
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]
也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...
- poj 2888 Magic Bracelet <polya定理>
题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...
- POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 3731 Accepted: 1227 D ...
- POJ 2888 Magic Bracelet(burnside引理+矩阵)
题意:一个长度为n的项链,m种颜色染色每个珠子.一些限制给出有些颜色珠子不能相邻.旋转后相同视为相同.有多少种不同的项链? 思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置 ...
- poj 2888 Magic Bracelet
经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...
- POJ 2888 Magic Bracelet ——Burnside引理
[题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...
- 解题:POJ 2888 Magic Bracelet
题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...
- HDU 2865 Birthday Toy [Polya 矩阵乘法]
传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$如果没有相邻不同的限制,就和$POJ\ 2154$一样了$|C(f)|=k^{\#( ...
随机推荐
- os系统
任务延时函数OSTimeDly 功能:调用该函数的任务将自己延时一段时间并执行一次任务调度,一旦规定的延时时间完成或有其它的任务通过调用OSTimeDlyResume()取消了延时,调用OSTimeD ...
- javascript 之继承-15
继承 所谓继承就是子类继承父类的特征与行为,使得子类对象具与父类相同的行为.但是javascript 是没有class.抽象类.接口等抽象概念,javascript 只有对象,那么js中是如何让对象与 ...
- final、finally、finalize
final是一个修饰词.可以修饰变量.方法.类 final修饰变量时分为两种 )1.修饰成员变量:该成员变量不可以被二次赋值.也就是说成员变量无法改变.且该成员变量要么在定义时初始化,要么在构造器中进 ...
- PHPMailer发送邮件中文附件名是乱码
可能使用了PHPMailer发送邮件的朋友带中文附件名时会出现乱码,下面我来介绍一个解决办法. 比如我们要发送的附件是"测试.txt",如果在添加附件的时候强制使用指定文件名的方式 ...
- NGINX 配置404错误页面转向
什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是 ...
- WinSCP怎么导入filezilla中的站点?
WinSCP是一款优秀的图形界面,远程文件管理工具,其出色的图形化界面与windows完美集成,是运用在windows上与远程服务器安全传输文件的软件之一 工具/原料 winscp 方法/步骤 下载. ...
- VisualSFM+PMVS生成稠密点云
利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...
- 【开发技术】web.xml vs struts.xml
web.xml用来配置servlet,监听器(Listener),过滤器(filter),还有404错误跳转页面,500,等还配置欢迎页面等,总之一句话,就是系统总配置方案写在web.xml中 str ...
- express官网学习笔记
npm init 创建一个package.json npm install express --save-dev 安装到项目依赖 便于多人开发 路由结构定义 app.METHOD(PATH, HAND ...
- linux_快照和克隆
什么是快照? 操作虚拟机时候,想保存当前状态为以后操作失误快速那时保存的系统状态,想当于对系统的版本管理,每个节点之间可以互相切换 什么是克隆? 可以选择快照和当前状态,可选择链接克隆和完整克隆 链接 ...