P4980-[模板]Pólya定理
正题
题目链接:https://www.luogu.com.cn/problem/P4980
题目大意
\(n\)个物品图上\(m\)种颜色,求在可以旋转的情况下本质不同的涂色方案。
解题思路
既然是群论基本题就顺便写一下刚刚了解到的相关知识把(顺便消磨一下时间
一个群\((G,\times )\)定义为一个在运算\(\times\)下满足以下条件的集合
- 封闭性:若存在\(a,b\in G\)那么有\(a\times b\in G\)
- 交换律:若有\(a,b,c\in G\)那么有\((a\times b)\times c=a\times (b\times c)\)
- 单位元:群中\(\exists e\in G\)满足\(\forall x\in G\)都有\(x\times e=x\)
- 逆元:对于\(\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\)中本质不同的元素个数为
\]
其中\(C(f)\)表示\(X\)的所有元素中对于置换\(f\)的不动点数量。
而\(\text{Polya}\)定理就是建立在\(\text{Burnside}\)引理上的,对于一个置换\(f\),定义它的循环节数量为\(T(f)\),用\(m\)种颜色染色时方本质不同的染色方案数就是
\]
也就是\(m^{T(f)}=C(f)\),这个很显然,因为每个循环节涂成一种颜色就是一个不动点。
回到这题的旋转来,我们可以将其视为\(n\)个不同的置换构成的一个置换群。对于旋转\(i\)步,它的循环节数量就是\(gcd(n,i)\),也就是我们要求
\]
枚举一下\(gcd(n,i)\)
\]
哦对啊好像有\(m=n\)
\]
这个时间复杂度大概是\(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定理的更多相关文章
- P4980 【模板】Polya定理
思路 polya定理的模板题,但是还要加一些优化 题目的答案就是 \[ \frac{\sum_{i=1}^n n^{gcd(i,n)}}{n} \] 考虑上方的式子怎么求 因为\(gcd(i,n)\) ...
- [洛谷P4980]【模板】Polya定理
题目大意:给一个$n$个点的环染色,有$n$中颜色,问有多少种涂色方案是的旋转后本质不同 题解:$burnside$引理:$ans=\dfrac1{|G|}\sum\limits_{g\in G}A_ ...
- 等价类计数:Burnside引理 & Polya定理
提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...
- [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)
小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...
- HDU 3923 Invoker 【裸Polya 定理】
参考了http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 的模板 对于每一种染色,都有一个等价群,例如旋转, ...
- Necklace of Beads (polya定理的引用)
Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n &l ...
- poj1286 Necklace of Beads—— Polya定理
题目:http://poj.org/problem?id=1286 真·Polya定理模板题: 写完以后感觉理解更深刻了呢. 代码如下: #include<iostream> #inclu ...
- poj2154 Color ——Polya定理
题目:http://poj.org/problem?id=2154 今天学了个高端的东西,Polya定理... 此题就是模板,然而还是写了好久好久... 具体看这个博客吧:https://blog.c ...
- Necklace of Beads(polya定理)
http://poj.org/problem?id=1286 题意:求用3种颜色给n个珠子涂色的方案数.polya定理模板题. #include <stdio.h> #include &l ...
- poj 1286 polya定理
Necklace of Beads Description Beads of red, blue or green colors are connected together into a circu ...
随机推荐
- wpf 自定义 RadioButton.
<Style TargetType="RadioButton" x:Key="nav"> <Setter Property="Tem ...
- C语言格式化输出语句
%d:带符号十进制整数 : %c:单个字符: %s:字符串: %f:6位小数:float; %.2f表示小数点后精确到两位 %lf:6位小数:double;
- 1.3RDD的设计与运行原理
此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 提供一种通用的数据抽象 RDD典型的执行过程如下: RDD读入外部数据源(或者内存中的集合 ...
- 在Spring中使用静态工厂时发生的无法得到对象的问题
因为我测试时,使用的是之前的包Spring 3.x一类的jar包,发现我的代码毫无问题,但是就是运行不出来,后面去Spring官网上发现,JDK6+至少都要使用Spring4.x了,而为了配合JDK8 ...
- 单例模式-案例Runtime
package d.create_type_single; import java.io.IOException; /** * Runtime类就是使用的单例:并且是饿汉式 * (原因考虑是因为:多线 ...
- Linux的基础——虚拟机的克隆
1.虚拟机的安装 虚拟机的安装在另一个文档 安装jdk(在另外一个文档中) 2.虚拟机的克隆 准备工作:一台装有Linux系统的主机(已经配置好jdk) 选择主机进行克隆 注意:这里一定要选择创建完整 ...
- SpringBoot笔记(6)
一.数据访问(SQL) 1.数据源的自动配置-HikariDataSource 1.导入JDBC场景 <dependency> <groupId>org.springframe ...
- 【MIT6.S081/6.828】手把手教你搭建开发环境
目录 1. 简介 2. 安装ubuntu20.04 3. 更换源 3.1 更换/etc/apt/sources.list文件里的源 3.2 备份源列表 3.3 打开sources.list文件修改 3 ...
- Swift-Button 的 highlighted(高亮)
摘要 在学习小程序时,看到小程序中的一个样式属性 hover-class,通过设置这个属性,就可以给点击的控件添加一个高亮效果.所以也就萌生了在 Swift 也实现一个类似的功能的想法,开干. 下面代 ...
- Vuex的同步异步存值取值
1. vue中各个组件之间传值 1.父子组件 父组件-->子组件,通过子组件的自定义属性:props 子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2, ...