BZOJ1478 Sgu282 Isomorphism

Problem A: Sgu282 Isomorphism

Time Limit: 15 Sec  Memory Limit: 64 MB
Submit: 172  Solved: 88
[Submit][Status][Discuss]

Description

给 定一个N 个结点的无向完全图( 任意两个结点之间有一条边), 现在你可以用 M 种颜色对这个图的每条边进行染色,每条边必须染一种颜色。 若两个已染色的图,其中一个图可以通过结点重新编号而与另一个图完全相同, 就称这两个染色方案相同。 现在问你有多少种本质不同的染色方法,输出结果 mod P。P 是一个大于N 的质数。

Input

仅一行包含三个数,N、M、P。

Output

仅一行,为染色方法数 mod P 的结果。

Sample Input

3 4 97

Sample Output

20

HINT

 


 题解:

   一眼可以看出这是置换群吧,但是它要求的是边置换,开始感觉没什么思路,但是想想一条边由(u,v)两个点构成

   于是我们有了新的思路:考虑将点置换转换为边置换

    

   我们可以发现点置换转化为的边置换同样具有相应的循环节

   于是考虑使用polya定理解决这个问题

   L:表示一个循环的大小; C:表示循环节的个数;

   首先对于一条边(u,v)它要分为两种情况:

   (1)u,v不在在同一个点循环,于是对于这条边所在的循环的大小为Lu-v=lcm(Lu,Lv),Cu-v=(Lu*Lv)/lcm(Lu,Lv)=gcd(Lu,Lv);

   (2) u,v在同一个点循环,于是分奇数和偶数进行讨论:

     一共C(L,2)条边 注:此处C为组合数

     1.奇数:Li是奇数,每个循环覆盖Li条边;循环节个数:

     2.偶数:Li是偶数,一个特例:覆盖Li/2条边的循环;循环节个数:

    (3)由上可知循环节个数:

    •实际N!个点置换中,有多少个     结构呢?

    •一个循环看成一个圆排列,现在要把 N个人分配到 k个长度分别为  的独立不相关圆排列中
    •因为有     L i==L j   的情况,设Bi为有多少个Lj=i
    •总分配数为

   (4由上求出答案即可:


 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define ll long long 
#define N 70
using namespace std;
ll n,m,p; 
ll num[N],l[N],bin[N];
ll ans;
ll read()
{
    ll x=0,f=1; char ch;
    while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
    while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
    return x*f;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;
}
ll ksm(int x,int k){ll res=1; for (int i=k; i; i>>=1,x=1ll*x*x%p) if (i&1) res=1ll*res*x%p; return res;
}
void cal(int k)
{
    ll s=1;
    for (int i=1; i<=n; i++) num[i]=0;
    for (int i=1; i<=k ;i++) num[l[i]]++;
    for (int i=1; i<=k; i++) s=s*l[i]%p;
    for (int i=1; i<=n; i++) s=s*bin[num[i]]%p;
    int c=0;
    for (int i=1; i<=k; i++)
    {
        c+=l[i]/2;
        for (int j=i+1; j<=k; j++) c+=gcd(l[i],l[j]);
    }
    ans=(ans+ksm(m,c)*bin[n]%p*ksm(s,p-2)%p)%p;
}
void dfs(int x,int k,int last)
{
    if (x==n+1) {cal(k-1); return;}
    for (int i=1; i<=last && x+i<=n+1; i++)
    {
        l[k]=i; dfs(x+i,k+1,i);
    }
}
int main()
{
    n=read(); m=read(); p=read();
    bin[0]=1; for (int i=1; i<=n; i++) bin[i]=bin[i-1]*i%p;
    dfs(1,1,n);
    printf("%lld\n",ans*ksm(bin[n],p-2)%p);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/HQHQ/p/5952261.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值