bzoj1488[HNOI2009] 图的同构

2024-05-11 23:58
文章标签 hnoi2009 同构 bzoj1488

本文主要是介绍bzoj1488[HNOI2009] 图的同构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:bzoj1488
题目大意:
求两两互不同构的含n个点的简单图有多少种。
简单图是关联一对顶点的无向边不多于一条的不含自环的图。
a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和边集能完全与b图一一对应。

题解:
置换-ploya
把一条边选和不选看成把一条边染成两种颜色之后,就跟bzoj1478/1815一样了..这样看来就是三倍经验了。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 80const int mod=997;
int ans,n,l[N],fac[N],gd[N][N],qm[10100];
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
int qpow(int x,int t)
{int ret=1;while (t){if (t&1) ret=(ret*x)%mod;x=(x*x)%mod;t>>=1;}return ret;
}
void get_ans(int cnt)
{int i,j,c=0;for (i=1;i<=cnt;i++) c=c+l[i]/2;for (i=1;i<cnt;i++)for (j=i+1;j<=cnt;j++) c=c+gd[l[i]][l[j]];int now=1,tt=0;for (i=1;i<=cnt;i++){if (l[i]!=l[i-1]){now=(now*fac[tt])%mod;tt=0;}tt++;}now=(now*fac[tt])%mod;for (i=1;i<=cnt;i++) now=(now*l[i])%mod;int S=(fac[n]*qpow(now,mod-2))%mod;ans=(ans+(S*qm[c])%mod)%mod;
}
void div(int cnt,int x,int ret)
{if (ret==0) {get_ans(cnt);return;}if (x>ret) return;cnt++;while (x<=ret){l[cnt]=x;div(cnt,x,ret-x);x++;}
}
int main()
{//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);int i,j;scanf("%d",&n);qm[0]=1;for (i=1;i<=n*n;i++) qm[i]=(qm[i-1]*2)%mod;fac[0]=1;for (i=1;i<=n;i++) fac[i]=(fac[i-1]*i)%mod;for (i=1;i<=n;i++)for (j=i;j<=n;j++) gd[j][i]=gd[i][j]=gcd(i,j);ans=0;div(0,1,n);printf("%d\n",(ans*qpow(fac[n],mod-2))%mod);return 0;
}

这篇关于bzoj1488[HNOI2009] 图的同构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981024

相关文章

数据结构:小白专场:树的同构2程序框架、建树及同构判别

T1T2是之前提到的结构数组,是全局变量,作为参数传进去 调用Ismorphic这个函数判断R1R2是不是同构的 首先考虑如何构建BuidTree函数 输入数据的结构如左图 知道n之后,n不为0,循环,循环一次读入一行数据 为了处理方便,三个信息读入的时候都处理成字符的方式读进来,left和right再把字符处理整数再放到left和right里面去 用了scanf三个%c读入三

【leetcode--同构字符串】

要求:判断两个字符串的形式是不是一致,即是不是AABC或者ABBBCC这种。 trick:使用set()结合zip()。 set()用法:用于创建一个不包含重复元素的集合 zip()用法:用于将可迭代的对象作为参数,将对象中的元素打包成一个个元组,然后返回这些元组组成的对象。 s="abc"t="xyz"zipped = zip(s,t)list_1 = list(zipped)

洛谷 P5043 【模板】树同构([BJOI2015]树的同构)题解 树哈希 树的重心

【模板】树同构([BJOI2015]树的同构) 题目描述 树是一种很常见的数据结构。 我们把 N N N 个点, N − 1 N-1 N−1 条边的连通无向图称为树。 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。 对于两个树 T 1 T_1 T1​ 和 T 2 T_2 T2​,如果能够把树 T 1 T_1 T1​ 的所有点重新标号,使得树 T 1

【同构字符串】python

思路: 先记录同一个值出现的次数,再将字典中的值取出,比较2个列表即可  代码: class Solution:def isIsomorphic(self, s: str, t: str) -> bool:dit1=dict()dit2=dict()for i in range(len(s)):if s[i] not in dit1:dit1[s[i]]=icontinue#记录

高等代数复习:同构定理

文章目录 同构定理 本篇文章适合个人复习翻阅,不建议新手入门使用 同构定理 接下来我们要证明如下几个同构定理 定理(线性映射同构定理) 设 φ : V → V ′ \varphi:V\to V' φ:V→V′ 是一个线性映射,则存在一个自然的线性同构 V / ker ⁡ φ ≅ Im ⁡ φ V/\ker \varphi \cong \operatorname{Im}

求1-10000之间的同构数

“同构数”是指这样的整数:它恰好出现在其平方数的右端。如:376*376=141376。请找出10000以内的全部“同构数” 来自360问答的题目,试着写了写,好歹实现了。 /*总结思路:1.求出1-10000之间每个数的位数(即这个数是几位数)2.再求出每个数的平方值,提取出最右端对应位数的数值出来(如369是个三个数,它的平方是136161,用取模%法提取出最右三位数字161

bzoj1485 [HNOI2009]有趣的数列

题目链接:bzoj1485 虽然有点很难看,但是我也没有办法,csdn吞我题解啊。 #include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;#define maxn 500010

LeetCode - 205. 同构字符串

描述 给定两个字符串 s 和 t,判断它们是否是同构的。 如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。 示例 1: 输入: s = "egg", t = "add" 输出: true 示例 2: 输入: s = "foo", t = "bar" 输出

CSR、SSR与同构渲染全方位解析

🔥 CSR、SSR与同构渲染全方位解析 🚀 🚀 引言 现代Web应用的核心渲染方式——客户端渲染(CSR)、服务器端渲染(SSR)以及同构渲染。接下来我们将通过对比它们的原理、应用场景、优缺点及实际案例,深入了解如何根据项目需求选择合适的渲染策略。 📖 概念详解 📈 客户端渲染(CSR) CSR工作原理: 客户端渲染主要依赖于Ajax或者Fetch API从服务器异步获取

✌粤嵌—2024/4/1—同构字符串

代码实现: 哈希表 bool isIsomorphic(char *s, char *t) {if (s == NULL || t == NULL) {return false;}int len_s = strlen(s), len_t = strlen(t);char str_s[256] = {0};char str_t[256] = {0};for (int i = 0; i