[SHOI2006]有色图

感觉polya定理还没搞太清,写点东西助于理解.
首先注意到这题求的是本质不同的染色方案,这个好像很符合polya定理求的东西.
\[l=\frac{1}{|G|}\sum_{i\in G}m^{w(i)}\]
其中\(w(i)\)表示的是i置换下的循环节个数
要用这个定理首先必须要找置换.发现边的置换很难找,于是考虑寻找点的置换和边的置换的联系.
如果我们暴力枚举点的置换.再把置换写成循环的形式,这样这些点就被我们分成一组一组的了.每个组就是一个循环.
一条边是连在两个点之间的,我们再来考虑在点的置换确定的条件下,边的置换个数的循环个数.
这个个数怎么求呢?
分两种情况讨论:

case1 两个点在一个循环内

现在想象l个点它们围成一个环,它们之间连满了边,边数是\(\left(\begin{matrix}l \\2\end{matrix}\right)\),如果环的元素是奇数个的话,你转l次就可以转回原来的样子,点一一对应,边也一一对应.那么边的循环长度显然就为l了,然后又有\(\frac{l(l-1)}{2}\)条边,那么循环节个数就是\(\frac{l-1}2\)了.
如果l为偶数,那么就会有一些边,你转180度,就可以转回来,它们的循环长度为\(\frac l 2\).
这些边有多少个呢?显然是\(\frac{l}{2}\)个,我们愉快地减掉它,就好了.循环个数:\[\frac{\frac{l(l-1)}{2}-\frac{l}2}{l}+\frac{\frac{l}{2}}{\frac{l}2}=\frac l 2\]

case2 两个点在不同循环内

同样用上面的方法,根据循环长度,计算循环个数,假设这两个点所在的点循环的长度分别为\(l_1,l_2\).那么它们合成的循环长度就为\(lcm(l_1,l_2)\),然后边数显然为\(l_1*l_2\)这就很美滋滋了.循环个数就为\(\frac{l_1*l_2}{lcm(l_1,_2)}=gcd(l_1,l_2)\)
所以这样以来,已知点的置换,得到的边置换的循环个数就为:
\[c=\sum_{i=1}^k\lfloor\frac{l_i}{2}\rfloor+\sum_{i=1}^k\sum_{j=i+1}^ngcd(l_i,l_j)\]


但是这样显然是不行的.
很容易发现对称群个数\(|S_n|=n!\)这个显然是不可以接受的.那我们想办法简化状态,之前的状态里包含了每个循环里具体有哪些点的信息,但是这些信息是多余的,我们只要知道每个循环里有多少个元素就可以了,那么我们原来枚举的东西,就可以代替成枚举整数的拆分.
但是光知道一种状态下的答案是不够的,我们还得计算有多少种点的置换对应这种状态.
设被当前状态为:被分成了k个循环,每个循环的元素个数为\(l_i\).
我们算的是状态对应的点的置换数,想一想发现,一个循环里点的顺序不同代表的置换是不同的,如果固定第一个点的话,后面的不同排列个数为\((l_i-1)!\)
所以如果每个l都不相同的话,那么\(S=\frac{n!}{\prod_{i=1}^k l_i!}*\prod_{i=1}^k (l_i-1)!=\frac{n!}{\prod_{i=1}^k l_i}\)
如果有相同的,那么设\(q_i\)为第i种l的个数.
所以\[S=\frac{n!}{(\prod_{i=1}^kl_i)*(\prod_{i=1}^{kind}q_i)}\]
这里可以用费马小定理求逆元.
\[\therefore ans=\sum S*m^c\]

// luogu-judger-enable-o2
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define maxn 105
#define ll long long
using namespace std;
ll mod,f[maxn],ans;
int n,m,rec[maxn];
ll gcd(ll a,ll b)
{if(b==0)return a;return gcd(b,a%b);
}
ll ksm(ll a,ll b)
{ll res=1;while(b){if(b&1)res=(res*a)%mod;a=a*a%mod;b>>=1;}return res;
}
void calc(int x)
{ll sum=0,mul=1;int now=1;for(int i=1;i<=x;i++)sum+=rec[i]/2;for(int i=1;i<=x;i++)for(int j=i+1;j<=x;j++)sum+=gcd(rec[i],rec[j]);for(int i=1;i<=x;i++)(mul*=rec[i])%=mod;for(int i=2;i<=x;i++){if(rec[i]!=rec[i-1])mul=mul*f[now]%mod,now=0;now++;}mul=mul*f[now]%mod;mul=f[n]*ksm(mul,mod-2)%mod;//cout<<n<<" "<<mul<<endl;ans=(ans+mul*ksm(m,sum)%mod)%mod;
}
void dfs(int k,int x,int s)
{if(!x)calc(k-1);if(x<s)return;for(int i=s;i<=x;i++){rec[k]=i;dfs(k+1,x-i,i);}
}
int main()
{cin>>n>>m>>mod;f[0]=1;for(int i=1;i<=n;i++)f[i]=f[i-1]*i%mod;dfs(1,n,1);ans=ans*ksm(f[n],mod-2)%mod;printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/terribleterrible/p/9669659.html

[SHOI2006]有色图相关推荐

  1. (每日一题)P4128 [SHOI2006] 有色图(文末有色图!)(Polya定理)(超级详细,清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.13 群论 嘿嘿嘿,本题题名为 有涩 ...

  2. [luogu4128][shoi2006]有色图

    前言 计数题 题目相关 题目链接 题目大意 nnn个点的完全图,对边染色(颜色有mmm种),求本质不同的染色方案数,答案对ppp取模 数据范围 1≤n≤53,1≤m≤1000,1≤p≤1091\le ...

  3. P4128 [SHOI2006]有色图

    传送门 数学渣渣看题解看得想死Ծ‸Ծ 首先发现这玩意儿看着很像polya定理 \[L=\frac{1}{|G|}\sum_{i\in G}m^{w(i)}\] 然而polya定理只能用来求点的置换,边 ...

  4. 《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列,小学生:我太难了   群论.置换.Bunrnside引理.Pόlya定理等概念是群 ...

  5. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]

    传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种. 两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同. 问N个顶点,k种颜色,本质不同的染色图个数(模 ...

  6. 【BZOJ1815BZOJ1488】有色图图的同构,Polya计数+暴力

    P1815 P1488 思路: 之前看论文发现的一道题目 点的置换引起边的置换 1488是弱化版 直接套烧边引理显然是不科学的 写了一个Polya的暴力,复杂度是O(n!n2)O(n!n^2) 跑不出 ...

  7. [BZOJ1815BZOJ1488]有色图/图的同构(Polya定理)

    由于有很多本质相同的重复置换,我们先枚举各种长度的点循环分别有多少个,这个暴搜的复杂度不大,n=53时也只有3e5左右.对于每种搜索方案可以轻易求出它所代表的置换具体有多少个. 但我们搜索的是点置换组 ...

  8. deepfakes怎么用_如何使用 Deepfakes 换脸

    如何使用 Deepfakes换脸 1.获取deepfakes工具包 git clone https://github.com/deepfakes/faceswap.git 2.补齐依赖包: pip i ...

  9. HEOI2018游记

    既然我已经凉了,就可以冷静一会儿了. Day -n 模拟赛呈现出和联赛之前非常相近的规律性--第一次放假之前有好有坏,第一次放假到第二次放假连续挂,第二次放假之后还看得过去,但是临出发之前好像又挂了几 ...

最新文章

  1. jQuery Mobile基础
  2. linux 没有线程的,,Linux 到现在还是没有线程呀?
  3. cad2008加载 et拓展工具_生物信息工具 | 如何为网络图添加漂亮的图例?
  4. 9招让你皮肤迅速白嫩 - 健康程序员,至尚生活!
  5. 【Computer Organization笔记09】x86 / Pentium 指令系统,MIPS 指令系统,数据通路的设计,CPU设计思路
  6. jquery选择器一
  7. 边缘计算应用场景_从6大应用场景,看边缘计算落地生根
  8. asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
  9. redis常用内容信息:
  10. Tomcat8安装及配置步骤
  11. 流媒体服务器开源方案调研
  12. Cannot uninstall .. It is a distutils installed project and thus we cannot accurately determine 解决方案
  13. 深入Java内存区域与OOM
  14. 抛弃Telemetry,用Faythe连接OpenStack和Prometheus
  15. 使用Python播放MIDI音符
  16. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
  17. HUAWEI 机试题:工厂流水线调度
  18. Security2:角色和权限
  19. 5、C++结构体的使用
  20. 邮件 发送excel表格做正文

热门文章

  1. watch 命令的使用
  2. 日语中7个必须知道的词句
  3. 5招让简历成为面试绿卡(转)
  4. oracle impdp导入覆盖,impdp覆盖的问题
  5. 【ROC包】分析与可视化ROC——plotROC、pROC
  6. java list分批
  7. [有明信息]横向集成、纵向贯通 ——地产财务管理新思路
  8. 题解报告:hdu 2066 一个人的旅行
  9. php中的js弹窗,浅谈javascript中的三种弹窗
  10. seq2seq (中英对照翻译)Attention