POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
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引理+矩阵优化+欧拉函数+逆元)的更多相关文章
- POJ 2888 Magic Bracelet ——Burnside引理
[题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- 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 2773 Happy 2006------欧几里得 or 欧拉函数。
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8359 Accepted: 2737 Descri ...
- 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)
题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...
- 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法
[POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...
- poj 2888 Magic Bracelet
经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...
- 解题:POJ 2888 Magic Bracelet
题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...
随机推荐
- 什么是restful风格?
文章参考 RESTful API 设计指南--阮一峰 概念 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更 ...
- USB hub串口绑定
方式一 1.查看串口信息 udevadm info /dev/ttyUSB0 2.创建配置文件 sudo vi /etc/udev/rules.d/com_port.rules ACTION==&qu ...
- 一、bootstrap-fontawesome-iconpicker组件
一.bootstrap-fontawesome-iconpicker组件 <!DOCTYPE html> <html lang="en"> <head ...
- Java 枚举和类的区别
枚举 包含一组常量合法的数据,不能创建枚举实例,也不能进行扩展. package com.jtfr.demo; public enum Week { MONDAY, TUESDAY, WEDNESDA ...
- 二、JPA的注解
@Entity注类就表示实体类了.注意:必须要有@Entity注解,否则会报错. @Table里面的就是表名和类名进行映射. @Id标识主键列,@GeneratedValue主键生成策略配合@Id使用 ...
- magento 站内优化和站外优化详解
关于Magento如何如何我就不做评论了,一句话,谁用谁知道,搜索了下,百度和谷歌中文里还真没有一篇系统的关于magento seo的内容,花了一个上午的时间,稍微整理了一下,算是给新人一个指引吧.主 ...
- JavaScript设计模式小抄集(持续更新)
前言 本文旨在记录JavaScript中常用的设计模式代码片段,简要说明使用场景,不过于追究细节.在设计模式开篇之前,还是先要搞清楚JavaScript中关于面向对象的基础知识,可以先看看JavaSc ...
- bzoj 2435
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 noi 你为什么那么diao, 这种世纪水题刷一道少一道啊... 我原来还以为是两边的联通块大 ...
- eclipse debug (调试)基础
进入debug模式: 1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域 ...
- (转)Spring Boot干货系列:(三)启动原理解析
转:http://tengj.top/2017/03/09/springboot3/ 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂Spri ...