解题:SHOI 2006 有色图
本质上是在对边求置换,然后每个循环里涂一样的颜色,但是还是要点上入手,考虑每条边的两个端点是否在一个循环里
如果在一个循环里,那么当循环长度$len$为奇数时只有转一整圈才行,而边的总数是$\frac{len(len-1)}{2}$,所以有$\frac{\frac{len(len-1)}{2}}{len}=\left\lfloor\frac{len}{2}\right\rfloor$个循环节;当循环长度为偶数时除了上面这种情况正对的每对点旋转$\frac{len}{2}$就可以,所以也是有$\frac{\frac{len(len-1)}{2}-frac{len}{2}}{len}+\frac{\frac{len}{2}}{\frac{len}{2}}=\left\lfloor\frac{len}{2}\right\rfloor$个循环节
如果不在一个循环里,那循环节数量就是套路的两者所在循环长度的GCD
那么暴搜数的拆分得到每种点置换就可以求出答案了,具体的,在总共$n!$种点置换中,每个循环节$i$自己做圆排列除去$len[i]$,同时每个长度的循环节之间的排列也要除去,所以设$cnt[i]$表示长度为$i$的循环节的数量,那么满足拆分$len[1],len[2],len[3].....len[m]$的点置换的方案数就是
$\frac{n!}{\prod\limits_{i=1}^mlen[i]\prod\limits_{i=1}^mcnt[i]!}$
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,p,ans,fac[N],inv[N],len[N];
int GCD(int a,int b)
{
return b?GCD(b,a%b):a;
}
int Qpow(int x,int k)
{
if(k==) return x;
int tmp=Qpow(x,k/);
return k%?1ll*tmp*tmp%p*x%p:1ll*tmp*tmp%p;
}
int Inv(int x)
{
return Qpow(x,p-);
}
void Calc(int cnt)
{
int pts=,bas=,lst=,sum=;
for(int i=;i<=cnt;i++)
{
bas=1ll*bas*len[i]%p;
if(len[i]!=len[lst])
bas=1ll*bas*fac[i-lst]%p,lst=i;
}
bas=1ll*bas*fac[cnt-lst+]%p;
pts=1ll*fac[n]*Inv(bas)%p;
for(int i=;i<=cnt;i++)
{
sum+=len[i]/;
for(int j=i+;j<=cnt;j++)
sum+=GCD(len[i],len[j]);
}
ans=(ans+1ll*pts*Qpow(m,sum)%p)%p;
}
void DFS(int cnt,int mnn,int mxx)
{
if(!mxx) Calc(cnt);
else
for(int i=mnn;i<=mxx;i++)
len[cnt+]=i,DFS(cnt+,i,mxx-i);
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
fac[]=inv[]=;
for(int i=;i<=n;i++) fac[i]=1ll*fac[i-]*i%p;
inv[n]=Inv(fac[n]);
for(int i=n-;i;i--) inv[i]=1ll*inv[i+]*(i+)%p;
DFS(,,n),printf("%lld",1ll*ans*inv[n]%p);
return ;
}
解题:SHOI 2006 有色图的更多相关文章
- 【BZOJ 1815】【SHOI 2006】color 有色图
http://www.lydsy.com/JudgeOnline/problem.php?id=1815 这道题好难啊,组合数学什么根本不会啊qwq 题解详见08年的Pólya计数论文. 主要思想是只 ...
- NOIP 2006 解题报告
第一题: 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
- 洛谷 P4128 [SHOI2006]有色图 解题报告
P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...
- 解题:CTSC 2006 歌唱王国
题面 概率生成函数 对于菜鸡博主来说好难啊 其一般形式为$F(x)=\sum\limits_{i=0}^∞[x==i]x_i$,第i项的系数表示离散变量x取值为i的概率 一般的两个性质:$F(1)=1 ...
- 解题:SHOI 2014 概率充电器
题面 显然就是在求概率,因为期望乘的全是1....然后就推推推啊 设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的 ...
- 解题:ZJOI 2006 皇帝的烦恼
禁止DP,贪心真香 有一个比较明显的贪心思路是让每个人和距离为$2$(隔着一个人)的人尽量用一样的,这样只需要扫一遍然后对每对相邻的人之和取最大值即可.但是当人数为奇数时这样就会出锅,因为最后一个人和 ...
- 解题:BJOI 2006 狼抓兔子
题面 可以看出来是最小割,然后你就去求最大流了 这么大的范围就是让你用网络流卡的?咋想的啊=.=??? 建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最 ...
- 解题:WC 2006 水管局长
题面 初见LCT,动态最小生成树+链上查询max,具体做法是把边转换成点(LCT只能维护点) 时光倒流,先把最后剩的连起来.然后查询就看链上最大值,修改看看链上最大值是否大于当前边,如果是就断开原来的 ...
- 解题:POI 2006 PRO-Professor Szu
题面 这个题是比较套路的做法啦,建反图后缩点+拓扑排序嘛,对于所有处在$size>=2$的SCC中的点都是无限解(可以一直绕) 然后注意统计的时候的小细节,因为无限解/大解也要输出,所以我们把这 ...
随机推荐
- 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装
一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...
- POJ 2299
上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解. 题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组. 感觉树状数组更高级一点,写起 ...
- LoRa---射频信号接收框架简图介绍
LoRa整体框架图如下: 内容下次再填! 内容补上: 射频信号的接收流程(小博并非专业,错了emmmmm轻喷):射频--->中频--->基带,下面按照图中标的序号开始介绍: 1.天线接受射 ...
- 前端页面loading效果(CSS实现)
当首页内容或图片比较多时,加载时间会比较长,此时可能出现页面白屏的情况,用户体验较差.所以,在页面完全加载出来之前,可以考虑加入loading效果,当页面完全加载完后,是loading消失即可. 1. ...
- Android——界面特效 相关知识总结贴
帮助android UI实现动画特效 http://www.apkbus.com/android-79595-1-1.html 帮助android应用程序实现动画特效 http://www.apkbu ...
- ubuntu set/unset proxy
export http_proxy export https_proxy unset http_proxy unset https_proxy
- 使用ClosedXML,读取到空行
最近项目中使用了ClosedXML.dll来处理Excel,在读取Excel的时候,用workSheet.Rows()获取Excel行数,默认读取Excel最大行数1048576 所以为了读取到不是空 ...
- C#_Stream
IO操作基本上需要用到Stream相关的子类,因此这类问题在CSDN问得也是比较多.其实对于Stream来说,操作起来比较简单,只要对细节的处理稍微注意一下,相信在使用它的时候也会得心应手. 对于St ...
- VMware在Centos7上配置静态IP的方法
使用NAT模式 在这里记下192.168.161.2 进入系统,为系统自动分配一个ip 记录下 192.168.161.129 进入网络管理器配置文件目录 cd /etc/sysconfig/netw ...
- c# winform调用摄像头识别二维码
首先我们需要引用两个第三方组件:AForge和zxing. Aforge是摄像头操作组件,zxing是二维码识别组件.都是开源项目.避免重复造轮子. 其实一些操作代码我也是参照别人的,若侵犯您的版权, ...