[SHOI2006] 有色图

题面在这里!

和上个题就是一样的啦,只不过颜色数从2变成了k,模数不再固定(不可以打表啦2333)

#include<bits/stdc++.h>
#define ll long long
using namespace std;

inline int add(int x,int y,const int ha){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y,const int ha){ x+=y; if(x>=ha) x-=ha;}

inline int ksm(int x,int y,const int ha){
	int an=1;
	for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
	return an;
}

int gcd[73][73],n,ans,jc[73],ni[73],k,ci[23333];
int m,a[65],tot,now,C[73][73],b[65],p;

inline void calc(){
    const int ha=p;

    m=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=b[i];j++) a[++m]=i;

	tot=0,now=1;
	for(int i=1;i<=m;i++) tot+=a[i]>>1;
	for(int i=1;i<=m;i++)
	    for(int j=i+1;j<=m;j++) tot+=gcd[a[i]][a[j]];

	for(int T=n,i=1;i<=m;T-=a[i],i++) now=now*(ll)C[T][a[i]]%ha*(ll)jc[a[i]-1]%ha;
	for(int i=1;i<=n;i++) if(b[i]>1) now=now*(ll)ni[b[i]]%ha;

	ADD(ans,now*(ll)ci[tot]%ha,ha);
}

void dfs(int x,int lef){
	if(lef<x){ if(!lef) calc(); return;}
	for(int i=0,u=0;u<=lef;i++,u+=x) b[x]=i,dfs(x+1,lef-u),b[x]=0;
}

int main(){
    scanf("%d%d%d",&n,&k,&p);
    const int ha=p;

    ci[0]=1; for(int i=1;i<=3000;i++) ci[i]=ci[i-1]*(ll)k%ha;

	jc[0]=1; for(int i=1;i<=60;i++) jc[i]=jc[i-1]*(ll)i%ha;
	ni[60]=ksm(jc[60],ha-2,ha);
	for(int i=60;i;i--) ni[i-1]=ni[i]*(ll)i%ha;	

	C[0][0]=1;
	for(int i=1;i<=60;i++){
		C[i][0]=1;
		for(int j=1;j<=i;j++) C[i][j]=add(C[i-1][j-1],C[i-1][j],ha);
	}

	for(int i=0;i<=n;i++)
	    for(int j=0;j<=i;j++)
	        if(!i||!j) gcd[i][j]=i+j;
	        else gcd[j][i]=gcd[i][j]=gcd[j][i%j];

    dfs(1,n),ans=ans*(ll)ni[n]%ha;

	printf("%d\n",ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/9245098.html

时间: 2024-10-18 00:14:28

[SHOI2006] 有色图的相关文章

Luogu P4128 [SHOI2006]有色图

题意与数据范围 求 \(n\) 个点不同构的简单无向图的数目,答案对 \(997\) 取模 \(A\) 图与 \(B\) 图被认为是同构的是指:\(A\) 图的顶点经过一定的重新标号以后,\(A\) 图的顶点集和边集要完全与 \(B\) 图一一对应 \(0\le n\le 60\) Solution 我们把无向图点的每一种重新排布的方式看作一种置换,则该置换群 \(G\) 的大小显然为 \(n!\) 对于置换群 \(G\) 中的每一个置换 \(g\) ,在 \(g\) 的作用下的不动点即为这样的

bzoj 1815: [Shoi2006]color 有色图 置换群

1815: [Shoi2006]color 有色图 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 136  Solved: 50[Submit][Status] Description Input 输入三个整数N,M,P 1< = N <= 53 1< = M < = 1000 N< P < = 10^ 9 Output 即总数模P后的余数 Sample Input input 1 3 2 97 Sample Output

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

传送门 题意: 染色图是无向完全图,且每条边可被染成k种颜色中的一种.两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同.问N个顶点,k种颜色,本质不同的染色图个数(模质数N≤53,P<109). 想了一节课和一中午又看了课件 相同类型的循环合并的想法很巧妙 首先,点的置换对应唯一边的置换,我们可以枚举所有点的置换,找出每个置换下边置换的循环有多少个,然后套$Polya$公式 但是复杂度带叹号 我们发现,很多点置换类型是一样的,我们可以对$n$搜索划分来枚举点置换的类

一些小总结

1).margin-top,margin-bottom不能正常显示时一.有时会遇到外层中的子层使用margin-top不管用的情况:这里我们需要在子层的前后加上一个 div{height:0;overflow:hidden;}例CSS样式表中:#box {background-color:#eee;}#box p {margin-top: 20px;margin-bottom: 20px;text-align:center;}解决方法:在P标签前后各加2个空的div:<divstyle="

如何使用 Deepfakes 换脸

如何使用 Deepfakes 换脸 1. 获取deepfakes工具包 git clone https://github.com/deepfakes/faceswap.git 2. 补齐依赖包: pip install tqdm pip install cv2 pip install opencv-contrib-python pip install dlib pip install keras pip install tensorflow pip install tensorflow-gpu(

dp优化总结

dp优化总结 一.滚动数组 典型的空间优化. 这应该是最最普通的一个优化了吧.. 对于某些状态转移第i个只需要用到第i-1个状态时,就可以用滚动数组,把第一维用0/1表示. 拓展1: 当一个状态转移要用到前m个转移时,我们依然可以滚起来,把第一维按模m的值滚起来. 拓展2: 若每一个决策可以选任意次(在一定限度下),那么我们可以借鉴完全背包的思路,把决策一个一个累计起来,起到优化时间的作用.(例题:NOIP2013 飞扬的小鸟) 二.数据结构优化 1.单调队列 如果一个转移方程模型大致如下: \

「不会」等价类计数

完全忘了TnT 然而这种类型的题目好像没考过.. 先复习一下万能的burnside引理, 啊不先复习一下定义(有些是本蒻自己yy的可能并不准确) 一个物体:被染色的对象 一个元素:一种染色方案 一个置换\(g\):一种让物体交换位置的变换方法 一个置换群\(G\):里面的置换满足封闭性结合律单位元逆元 一个循环(对于一个置换i来说的):不停地用一个置换作用于所有物体,物体呈现循环运动的轨迹(数目记为\(h_i\)) 一个不动点(对于一个置换i来说的):被该置换作用后,不发生改变的一个元素(数目记

置换群(等价类计数)

一.定义 群 ??群是啥???我不会啊 置换(\(g\)) ??一个置换是一种运算,代表让物体交换位置的一种方法 置换群(\(G\)) ??顾名思义,由置换构成的群 k不动置换类(\(Z_k\))(稳定化子) ??使元素 \(k\) 不改变位置的群的集合 等价类(\(E_k\))(轨道) ??在置换群 \(G\) 作用下元素 \(k\) 的运动轨迹(一些点的集合) 循环(\(h_g\)) ??在置换 \(g\) 作用下产生的循环 轨道-稳定化子定理 \[|E_k|\times|Z_k|=|G|\