P4980-[模板]Pólya定理

1|0正题

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


1|1题目大意

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


1|2解题思路

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

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

  1. 封闭性:若存在a,bG那么有a×bG
  2. 交换律:若有a,b,cG那么有(a×b)×c=a×(b×c)
  3. 单位元:群中eG满足xG都有x×e=x
  4. 逆元:对于xG都有一个唯一元素yGx×y=e

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

一般来说规定置换第一行为(1,2,3...),那么定义一个置换σ=(g1,g2,g3,...)。如果一个置换作用与一个排列a,一般写为σ(a)=b的话,就有bi=agi。需要注意的是对于一个置换两次后相当与使用了另一个置换。(也就是置换只能生效一次

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

1|G|fGC(f)

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

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

1|G|fGmT(f)

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

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

1ni=0n1mgcd(n,i)

枚举一下gcd(n,i)

1nd|nmdi=1nd[gcd(nd,i)==1]

哦对啊好像有m=n

1nd|nndφ(nd)=d|nnd1φ(nd)

这个时间复杂度大概是O(Tn34)的,但是因为约数个数远到不了n所以你可以把它视为常数比较大的O(Tn)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14269213.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示