正题

题目链接: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. Data-truncation--Incorrect-string-value

    修改表中,format_content 字段的字符集为utf8mb4 alter table 表名 modify column format_content longtext character se ...

  2. 微信小程序中h5跳转到登录页面,登陆成功返回携带参数,h5刷新

    公司的一个小程序,要做一个活动,需要判断登录状态. 思路:h5跳转到登录页面,登陆成功携带token自动返回. 本来以为是个非常简单的功能,没想到..... 发帖记录一下 1.登录页面 用getCur ...

  3. 因为手机设置字体大小导致h5页面在webview中变形的BUG

    出现这个问题,有以下因素 你的页面采用了rem单位,并且是采用js动态计算html的font-size你的页面被加在了APP中的webview中这该死的手机被重设了字体大小解决方法一般,我们动态计算好 ...

  4. tomcat启动与运行时出现中文乱码问题

    解决方法 到tomcat/conf/目录下  修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更 ...

  5. Layui form表单提交注意事项

    // 表单提交form.on('submit(first1)', function (data) { var articleFrom = data.field; $.ajax({ type:" ...

  6. 10个最酷的Linux单行命令

    下面是来自  Commandlinefu 网站由用户投票决出的 10 个最酷的 Linux 单行命令,希望对你有用. sudo !! 以 root 帐户执行上一条命令. python -m Simpl ...

  7. APMServ中Apache启动失败的原因

    APMServ中Apache启动失败绝大多数的情况是因为APMServ得路径出错和80端口被占用,也有可能您使用的是WIN8系统,下面SJY根据不同情况告诉大家如何解决APMServ中Apache启动 ...

  8. Tars | 第3篇 Tars中期汇报测试文档(Java语言实现Subset路由规则)

    目录 前言 1. 任务介绍 2. 测试模拟方案 2.0 *前置工作 2.1 添加路由规则 2.2 添加存活节点 2.3 [输出]遍历输出当前存活节点 2.4 [核心]对存活节点按subset规则过滤 ...

  9. 聊聊 Jmeter 如何并发执行 Python 脚本

    1. 前言 大家好,我是安果! 最近有小伙伴后台给我留言,说自己用 Django 写了一个大文件上传的 Api 接口,现在想本地检验一下接口并发的稳定性,问我有没有好的方案 本篇文章以文件上传为例,聊 ...

  10. Linux环境搭建及项目部署

    一. VMWare安装图解 1.点击下一步 2.接受条款,下一步 3.选择安装目录,不建议有中文目录和空格目录.下一步 4.下一步 5.这两个选项根据可以爱好习惯选择,下一步 6.安装 7.完成 9. ...