正题

题目链接:https://www.luogu.com.cn/problem/P4980


题目大意

\(n\)个物品图上\(m\)种颜色,求在可以旋转的情况下本质不同的涂色方案。


解题思路

既然是群论基本题就顺便写一下刚刚了解到的相关知识把(顺便消磨一下时间

一个群\((G,\times )\)定义为一个在运算\(\times\)下满足以下条件的集合

  1. 封闭性:若存在\(a,b\in G\)那么有\(a\times b\in G\)
  2. 交换律:若有\(a,b,c\in G\)那么有\((a\times b)\times c=a\times (b\times c)\)
  3. 单位元:群中\(\exists e\in G\)满足\(\forall x\in G\)都有\(x\times e=x\)
  4. 逆元:对于\(\forall x\in G\)都有一个唯一元素\(y\in G\)且\(x\times y=e\)

然后中间一些东西很多很杂这里不多说了,直接到置换部分。

一般来说规定置换第一行为\((1,2,3...)\),那么定义一个置换\(\sigma=(g_1,g_2,g_3,...)\)。如果一个置换作用与一个排列\(a\),一般写为\(\sigma(a)=b\)的话,就有\(b_i=a_{g_i}\)。需要注意的是对于一个置换两次后相当与使用了另一个置换。(也就是置换只能生效一次

然后就是\(\text{Burnside}\)引理了,对于一个置换群\(G\),若\(G\)作用与一个集合\(X\)时,集合\(X\)中本质不同的元素个数为

\[\frac{1}{|G|}\sum_{f\in G}C(f)
\]

其中\(C(f)\)表示\(X\)的所有元素中对于置换\(f\)的不动点数量。

而\(\text{Polya}\)定理就是建立在\(\text{Burnside}\)引理上的,对于一个置换\(f\),定义它的循环节数量为\(T(f)\),用\(m\)种颜色染色时方本质不同的染色方案数就是

\[\frac{1}{|G|}\sum_{f\in G}m^{T(f)}
\]

也就是\(m^{T(f)}=C(f)\),这个很显然,因为每个循环节涂成一种颜色就是一个不动点。

回到这题的旋转来,我们可以将其视为\(n\)个不同的置换构成的一个置换群。对于旋转\(i\)步,它的循环节数量就是\(gcd(n,i)\),也就是我们要求

\[\frac{1}{n}\sum_{i=0}^{n-1}m^{gcd(n,i)}
\]

枚举一下\(gcd(n,i)\)

\[\frac{1}{n}\sum_{d|n}m^d\sum_{i=1}^{\frac{n}{d}}[gcd(\frac{n}{d},i)==1]
\]

哦对啊好像有\(m=n\)

\[\frac{1}{n}\sum_{d|n}n^d\varphi(\frac{n}{d})=\sum_{d|n}n^{d-1}\varphi(\frac{n}{d})
\]

这个时间复杂度大概是\(O(Tn^{\frac{3}{4}})\)的,但是因为约数个数远到不了\(\sqrt n\)所以你可以把它视为常数比较大的\(O(T\sqrt n)\)?


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll P=1e9+7;
ll T,n,ans;
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
ll phi(ll x){
ll ans=x;
for(ll i=2;i*i<=x;i++){
if(x%i)continue;
while(x%i==0)x/=i;
ans=ans/i*(i-1);
}
if(x>1)ans=ans/x*(x-1);
return ans;
}
ll calc(ll x)
{return phi(x)*power(n,n/x-1)%P;}
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld",&n);ans=0;
for(ll i=1;i*i<=n;i++){
if(n%i)continue;
ans=(ans+calc(i))%P;
if(i*i!=n)ans=(ans+calc(n/i))%P;
}
printf("%lld\n",ans);
}
return 0;
}

P4980-[模板]Pólya定理的更多相关文章

  1. P4980 【模板】Polya定理

    思路 polya定理的模板题,但是还要加一些优化 题目的答案就是 \[ \frac{\sum_{i=1}^n n^{gcd(i,n)}}{n} \] 考虑上方的式子怎么求 因为\(gcd(i,n)\) ...

  2. [洛谷P4980]【模板】Polya定理

    题目大意:给一个$n$个点的环染色,有$n$中颜色,问有多少种涂色方案是的旋转后本质不同 题解:$burnside$引理:$ans=\dfrac1{|G|}\sum\limits_{g\in G}A_ ...

  3. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  4. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  5. HDU 3923 Invoker 【裸Polya 定理】

    参考了http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 的模板 对于每一种染色,都有一个等价群,例如旋转, ...

  6. Necklace of Beads (polya定理的引用)

    Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n &l ...

  7. poj1286 Necklace of Beads—— Polya定理

    题目:http://poj.org/problem?id=1286 真·Polya定理模板题: 写完以后感觉理解更深刻了呢. 代码如下: #include<iostream> #inclu ...

  8. poj2154 Color ——Polya定理

    题目:http://poj.org/problem?id=2154 今天学了个高端的东西,Polya定理... 此题就是模板,然而还是写了好久好久... 具体看这个博客吧:https://blog.c ...

  9. Necklace of Beads(polya定理)

    http://poj.org/problem?id=1286 题意:求用3种颜色给n个珠子涂色的方案数.polya定理模板题. #include <stdio.h> #include &l ...

  10. poj 1286 polya定理

    Necklace of Beads Description Beads of red, blue or green colors are connected together into a circu ...

随机推荐

  1. java集成网站微信,微博,qq登录

    微信 WechatConfig.java package com.meeno.chemical.common.sdk.wechat.config; import org.springframework ...

  2. 自定义Vue&Element组件,实现用户选择和显示

    在我们很多前端业务开发中,往往为了方便,都需要自定义一些用户组件,一个是减少单一页面的代码,提高维护效率:二个也是方便重用.本篇随笔介绍在任务管理操作中,使用自定义Vue&Element组件, ...

  3. Android系统编程入门系列之广播接收者BroadcastReceiver实现进程间通信

    在前边几篇关于Android系统两个重要组件的介绍中,界面Activity负责应用程序与用户的交互,服务Service负责应用程序内部线程间的交互或两个应用程序进程之间的数据交互.看上去这两大组件就能 ...

  4. javaWeb常用面试题

    JDBC JDBC访问数据库的基本步骤是什么? 加载驱动 通过DriverManager对象获取连接对象Connection 通过连接对象获取会话,有2种方式Statement.PreparedSta ...

  5. c++中的一些会用到的函数

    1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() { 5 string s ...

  6. java 循环移位输出全排列

    //题目:利用1.2.2.3.4这4个数字,用java写一个main函数打印出所有不同的排列,如12234,,2234等,要求打印出来不能有重复 1 package test123; 2 3 impo ...

  7. opencv入门系列教学(四)处理鼠标事件

    一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...

  8. YOLO V3 原理

    基本思想V1: 将输入图像分成S*S个格子,每隔格子负责预测中心在此格子中的物体. 每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率. bbox ...

  9. MySQL 事务和锁

    1. 事务 1.1 什么是事务? 1.2 事务的特性:ACID 1.3 事务语句 1.4 事务的隔离级别 1.5 锁 1.6 事务隔离解决并发问题 2. 死锁 2.1 场景示例 2.2 死锁调优 3. ...

  10. 学习Linux tar 命令:最简单也最困难

    摘要:在本文中,您将学习与tar 命令一起使用的最常用标志.如何创建和提取 tar 存档以及如何创建和提取 gzip 压缩的 tar 存档. 本文分享自华为云社区<Linux 中的 Tar 命令 ...