博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1004 HNOI2008 Cards Burnside引理
阅读量:5742 次
发布时间:2019-06-18

本文共 1310 字,大约阅读时间需要 4 分钟。

标题效果:特定n张卡m换人,编号寻求等价类

数据保证这m换人加上置换群置换后本身构成

BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做

Burnside引理……昨晚为了做这题硬啃了一晚上白书0.0 都快啃吐了0.0

Burnside引理:一个置换群下的等价类个数等于全部置换的不动点个数的平均值

没有接触过群论的建议去啃白书…… 网上的东西看不懂的

最后那个除法要用乘法逆元 我懒得写EXGCD写了费马小定理0.0

#include
#include
#include
#include
#define M 70using namespace std;int r,g,b,m,n,p,ans;int a[M],stack[M],top;int f[21][21][21];void DFS(int x){ stack[top]++; int temp=a[x]; a[x]=0; if(a[temp]) DFS(temp);}int DP(){ int i,j,k; memset(f,0,sizeof f);f[0][0][0]=1; while(top) { for(i=r;~i;i--) for(j=g;~j;j--) for(k=b;~k;k--) { if(i>=stack[top]) f[i][j][k]+=f[i-stack[top]][j][k]; if(j>=stack[top]) f[i][j][k]+=f[i][j-stack[top]][k]; if(k>=stack[top]) f[i][j][k]+=f[i][j][k-stack[top]]; f[i][j][k]%=p; } stack[top--]=0; } return f[r][g][b];}int KSM(int x,int y){ int re=1; while(y) { if(y&1)re*=x,re%=p; x*=x,x%=p; y>>=1; } return re;}int main(){ int i,j; cin>>r>>g>>b>>m>>p; n=r+g+b; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) scanf("%d",&a[j]); for(j=1;j<=n;j++) if(a[j]) ++top,DFS(j); ans+=DP(),ans%=p; } for(j=1;j<=n;j++) a[j]=j; for(j=1;j<=n;j++) if(a[j]) ++top,DFS(j); ans+=DP(),ans%=p; ans*=KSM(m+1,p-2),ans%=p; cout<
<

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
P1772 [ZJOI2006]物流运输
查看>>
sizeof && strlen()
查看>>
如何安装Pycharm官方统计代码行插件
查看>>
Release和Debug的区别[转]
查看>>
Unity C#常用API和相关关键字
查看>>
oracle11g 数据库导出报“ EXP-00003:
查看>>
机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...
查看>>
Luogu_2876_[USACO07JAN]解决问题Problem Solving
查看>>
Oracle RAC 并发与架构
查看>>
java空指针异常:java.lang.NullPointException
查看>>
Maven启用代理访问
查看>>
json 序列化的两种方式
查看>>
ABI/EABI/OABI
查看>>
SQL SERVER 2008 利用发布订阅方式实现数据库同步
查看>>
继承和多态 笔记
查看>>
Two Graphs 牛客网暑期ACM多校训练营(第一场)D 图论基础知识 全排列
查看>>
其他进制的数字
查看>>
[LeetCode系列]翻转链表问题II
查看>>
12XML(可扩展标记语言)
查看>>
软件测试职业规划
查看>>