Burnside引理经典好题呀!

题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的。

这题时间卡得很紧,注意矩阵乘法不能太多次取模,不然会TLE。   因为这题的模数是9973,加完之后再取模也不会炸。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=1e6+;
const int MOD=;
int n,m,k,tot=; struct matrix{
int m[][];
matrix() { memset(m,,sizeof(m)); }
friend matrix operator*(matrix a,matrix b) {
matrix res;
for (int i=;i<=;i++) for (int j=;j<=;j++) {
for (int k=;k<=;k++) res.m[i][j]=res.m[i][j]+a.m[i][k]*b.m[k][j];
res.m[i][j]%=MOD; //少取模不然会TLE
}
return res;
}
}; bool vis[N]; int pri[N];
void prework(int n) {
memset(vis,false,sizeof(vis)); //vis为0素数 1和数
for (int i=;i<=n;i++){
if (!vis[i]) pri[++tot]=i;
for (int j=;j<=tot&&i*pri[j]<=n;j++){
vis[i*pri[j]]=;
if (i%pri[j]==) break;
}
}
} int power(int x,int p) {
int ret=; x%=MOD;
for (;p;p>>=) {
if (p&) ret=(ret*x)%MOD;
x=(x*x)%MOD;
}
return ret;
} int phi(int n) {
int ret=n;
for (int i=;i<=tot && pri[i]<=sqrt((double)n);i++)
if (n%pri[i]==) {
ret=ret/pri[i]*(pri[i]-);
while (n%pri[i]==) n/=pri[i];
}
if (n>) ret=ret/n*(n-);
return ret%MOD;
} int count(matrix A,int p) { //计算B=A^p 然后返回sigma(B[i][i])
matrix B;
for (int i=;i<=m;i++) B.m[i][i]=;
for (;p;p>>=) {
if (p&) B=B*A;
A=A*A;
}
int ret=;
for (int i=;i<=m;i++) ret=(ret+B.m[i][i])%MOD;
return ret;
} //POJ-2888 由n(n <= 10^9)个珠子组成的项链,每个珠子共有m(m <= 10)种颜色,再给定k组限制(a, b)表示颜色a和颜色b的珠子不能相邻,问总共有多少种方案满足长度为n的项链。
//题解:Burnside引理 + 矩阵优化 + 欧拉函数 + 逆元。
int main()
{
prework();
int T; cin>>T;
while (T--) {
scanf("%d%d%d",&n,&m,&k); matrix A; //可达矩阵(类似图论)
for (int i=;i<=k;i++) {
int x,y; scanf("%d%d",&x,&y);
A.m[x][y]=A.m[y][x]=;
}
for (int i=;i<=m;i++) for (int j=;j<=m;j++) A.m[i][j]=-A.m[i][j]; int ans=;
for (int i=;i*i<=n;i++)
if (n%i==) {
ans=(ans+count(A,i)*phi(n/i)%MOD)%MOD;
if (i*i!=n) ans=(ans+count(A,n/i)*phi(i)%MOD)%MOD;
}
cout<<ans*power(n,MOD-)%MOD<<endl;
}
return ;
}

POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)的更多相关文章

  1. POJ 2888 Magic Bracelet ——Burnside引理

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

  2. poj 2888 Magic Bracelet(Polya+矩阵快速幂)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 4990   Accepted: 1610 D ...

  3. POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 3731   Accepted: 1227 D ...

  4. POJ 2888 Magic Bracelet(burnside引理+矩阵)

    题意:一个长度为n的项链,m种颜色染色每个珠子.一些限制给出有些颜色珠子不能相邻.旋转后相同视为相同.有多少种不同的项链? 思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置 ...

  5. POJ 2773 Happy 2006------欧几里得 or 欧拉函数。

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8359   Accepted: 2737 Descri ...

  6. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  7. 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法

    [POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...

  8. poj 2888 Magic Bracelet

    经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...

  9. 解题:POJ 2888 Magic Bracelet

    题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...

随机推荐

  1. go语言从例子开始之Example7.switch分支结构

    switch ,方便的条件分支语句 package main import "fmt" import "time" func main() { 一个基本的 sw ...

  2. 入门GoldenGate总结

    前言 GoldenGate 是oracle官方的一款数据同步产品,类似于msyql的主从复制,配置也稍稍复杂,其中概念一定要搞清楚,不然会被坑的爬不起. 坑 1.数据在线同步(不是指数据初始化),只能 ...

  3. 笔记73 高级SSM整合2

    遇到的问题: 1.表单信息校验:jQuery前端校验,ajax用户名重复校验,重要信息后端校验(JSR303)+数据库约束 2.在设置下拉列表显示的值时出现问题. 3.邮箱也添加重复性校验 4.pub ...

  4. 容器和Docker

    一.容器 1.虚拟机和容器的区别 (1)为什么要用docker 服务器端开发/部署: 实现更轻量级的虚拟化,方便快速部署, 对于部署来说可以极大的减少部署的时间成本和人力成本 Docker支持将应用打 ...

  5. Electron-vue实战(二)— 请求Mock数据渲染页面

    Electron-vue实战(二)— 请求Mock数据渲染页面 作者:狐狸家的鱼 本文链接 GitHub:sueRimn 一.环境搭建 1.安装Mock.js 如果仅仅用作脱离后台的模拟数据,就安装在 ...

  6. typedef 复杂函数指针

    下面是三个变量的声明,我想使用typedef分别给它们定义一个别名,请问该如何做? >1:int *(*a[5])(int, char*); >2:void (*b[10]) (void ...

  7. HTML中多媒体标签技术说明

    在纯文本的HTML页面中加入图片,给原来单调乏味的页面添加生气.HTML语言中利用<IMG>标记插入图片. 1.图片标记<IMG>及其属性 在网站上,网页设计者都使用了大量精心 ...

  8. JAVA 的StringBuffer类

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  9. 当前系统的CPU和内存的空闲百分比

    设想我们有一个php页面A比较耗资源,因此在每次执行页面A中的代码前需要检测一下系统目前CPU和内存的空闲百分比.我们可以利用下面几个函数来解决这个问题 1 2 3 4 5 6 7 8 9 10 11 ...

  10. cs224d 作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络

    1.Recursive Nerual Networks能够更好地体现每个词与词之间语法上的联系这里我们选取的损失函数仍然是交叉熵函数 2.整个网络的结构如下图所示: 每个参数的更新时的梯队值如何计算, ...