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. 基于SSL实现MySQL的加密主从复制

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012974916/article/details/53316758 大家都知道MySQL的主从复制 ...

  2. 项目部署到IIS后,明明存在某个文件,但是访问却返回404

    项目部署到IIS后,明明存在某个文件,但是访问却返回404,这是为什么呢,原因很可能是未添加MIME类型 比如我的文件名是“iconfont.woff” 打开IIS,点击对应的项目,右面展示的是下图 ...

  3. 一、Nuget管理

    一.注册账号 http://www.nuget.org 可用微软账户登录注册 手机端授权 二.打包Nuget 1.新建一个.NET Standard 的类库项目(取名类库) 更改方法 2.选择项目属性 ...

  4. HashMap不能使用基本数据类型作为key

    HashMap存储元素采用的是hash表存储数据,每存储一个对象的时候,都会调用其hashCode()方法,算出其hash值,如果相同,则认为是相同的数据,直接不存储,如果hash值不同,则再调用其e ...

  5. Python 序列类型拆包 %s 和'{}'.format 的功能差异之一

    >>> 1, 2, 3 #这样写成一行相当于一个元组(1, 2, 3)>>> x = 1, 2, 3>>> x(1, 2, 3)>>& ...

  6. tp框架数据查询,增删改

    select()是数据模型的一个指定方法,可以获得数据表的数据信息 返回一个二维数组信息,当前数据表的全部数据信息 $obj = D();  创建对象 $obj -> select();  查询 ...

  7. 大碗宽面Beta阶段第十一周会议记录

    本周二晚上我们在宿舍楼的大厅进行了本周的小组会议,虽然天气很冷,但大家都还是如数到场,积极参加小组会议.对于上周的任务大家都努力完成,在前端方面,大家完善了主页面和一些分页面,主要有导航栏界面的完成. ...

  8. MySQL安装/卸载

    http://jishu8.cc/2017/02/06/55/ 检查端口是否冲突:netstat nao | findstr 3307  启动服务:services.msc

  9. 開啟windows 7 ,10 的熱點功能(無線熱點)

    開啟windows 7 ,10 的熱點功能: 1.首先要確定你的電腦無線芯片有無熱點功能  # netsh wlan show drivers    Hosted network supported ...

  10. 求最小生成树(暴力法,prim,prim的堆优化,kruskal)

    求最小生成树(暴力法,prim,prim的堆优化,kruskal) 5 71 2 22 5 21 3 41 4 73 4 12 3 13 5 6 我们采用的是dfs的回溯暴力,所以对于如下图,只能搜索 ...