题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004

   http://poj.org/problem?id=2409

学习材料:https://www.cnblogs.com/nietzsche-oier/p/6883880.html

     https://files-cdn.cnblogs.com/files/HocRiser/Burnside.pdf

bzoj 1004:这道题注意考虑单位元的那个置换。

然后用 polya 定理即可。不动点个数是 dp 出来的,以保证合法。 dp 时注意 res -= tot 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=;
int n,m,mod,s0,s1,s2,a[N],f[N],dp[][M][M][M],ans;
bool vis[N];
void upd(int &x){x>=mod?x-=mod:;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
int solve()
{
memset(vis,,sizeof vis);
memset(dp[],,sizeof dp[]); dp[][s0][s1][s2]=;
bool fx=; int res=n;
for(int i=;i<=n;i++)
if(!vis[i])
{
int tot=,cr=i;
while(!vis[cr])
{
tot++; vis[cr]=;
cr=a[cr];
}
bool tf=!fx; memset(dp[tf],,sizeof dp[tf]);
for(int x0=s0;x0>=;x0--)
for(int x1=s1;x1>=;x1--)
{
int x2=res-x0-x1,d;
if(x2>s2||!(d=dp[fx][x0][x1][x2]))continue;
if(x0>=tot)dp[tf][x0-tot][x1][x2]+=d,upd(dp[tf][x0-tot][x1][x2]);
if(x1>=tot)dp[tf][x0][x1-tot][x2]+=d,upd(dp[tf][x0][x1-tot][x2]);
if(x2>=tot)dp[tf][x0][x1][x2-tot]+=d,upd(dp[tf][x0][x1][x2-tot]);
}
fx=tf; res-=tot;
}
return dp[fx][][][];
}
int main()
{
scanf("%d%d%d%d%d",&s0,&s1,&s2,&m,&mod);
n=s0+s1+s2;
for(int j=;j<=n;j++)a[j]=j;
ans+=solve(); upd(ans);
for(int i=;i<=m;i++)
{
for(int j=,d;j<=n;j++)scanf("%d",&d),a[d]=j;
ans+=solve(); upd(ans);
}
ans=(ll)ans*pw(m+,mod-)%mod;
printf("%d\n",ans);
return ;
}

poj 2409:polya模板。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=;
int n,m; ll ans;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
ll pw(ll x,int k)
{ll ret=;while(k){if(k&)ret*=x;x*=x;k>>=;}return ret;}
int main()
{
while()
{
scanf("%d%d",&m,&n);if(!n&&!m)return ;
ans=;
for(int i=;i<=n;i++)ans+=pw(m,gcd(n,i));
if(n&) ans+=n*pw(m,n+>>);
else ans+=(n*pw(m,n>>)>>)+(n*pw(m,(n>>)+)>>);
printf("%lld\n",ans/(n<<));
}
return ;
}

bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群的更多相关文章

  1. bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...

  2. BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )

    题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...

  3. [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

    题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...

  4. BZOJ 1004: [HNOI2008]Cards

    Description 给你一个序列,和m种可以使用多次的置换,用3种颜色染色,求方案数%p. Sol Burnside定理+背包. Burnside定理 \(N(G,\mathbb{C})=\fra ...

  5. BZOJ 1004 HNOI2008 Cards Burnside引理

    标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...

  6. BZOJ 1004: [HNOI2008]Cards(群论)

    好吧我就是蒟蒻根本没听说过群论(虽说听叉姐说几万年都不会考) 我也讲不太来,直接戳VFK大神的blog啦 = = http://vfleaking.blog.163.com/blog/static/1 ...

  7. BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]

    传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...

  8. POJ 2409 Let it Bead [置换群 Polya]

    传送门 题意:$m$种颜色$n$颗珠子,定义旋转和翻转两种置换,求不等价着色数 暴力求每个置换的循环节也许会$T?$ 我们可以发现一些规律: 翻转: $n$为奇数时每个置换有$1+\frac{n-1} ...

  9. bzoj 1004 1004: [HNOI2008]Cards burnside定理

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Stat ...

随机推荐

  1. JavaEE之Junit单元测试

    1编写测试类,简单理解Junit可以部分用于取代java的main方法 2在测试类方法上添加注解 @Test 3 @Test修饰的方法要求:public void 方法名() {…} ,方法名自定义建 ...

  2. 初入spring boot(四 )web项目

    1. 模板引擎 spring boot提供了大量的模板引擎,包括FreeMark.Groovy.Thymeleaf.Velocity等,但spring boot中推荐用Thymeleaf,因为Thym ...

  3. 解决Spark用Maven编译时报Exception in thread "main" java.lang.OutOfMemoryError: PermGen space异常

    异常截图: 解决方法: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

  4. 一个问题:C#引用类型传参,说出你的答案

    namespace ConsoleApplication1 { class Program { static void Main(string[] args) { People p = new Peo ...

  5. JDK_如何查看安装的jdk是32位还是64位?

    1. 1.1.32位系统只能装 32位 jdk 1.2.64位系统,安装的 32位JDK 和 64位JDK 是不同的目录 1.2.1.32位的路径 类似:C:\Program Files (x86)\ ...

  6. OAuth2疑问解答

    转自:http://bylijinnan.iteye.com/blog/2277548 OAuth2的学习,我也是从阮一峰老师的博客中开始的:http://www.ruanyifeng.com/blo ...

  7. selenium学习笔记(webdriver下载配置)

    selenium安装后默认安装firefox可以直接使用,当然可以通过其它浏览器 博主这里整理了:chrome . IE 首先是下载地址 http://docs.seleniumhq.org/down ...

  8. jenkins构建中的除零错误

    一. 除零错误(ZeroDivisionError) 今天在jenkins上运行接口自动化测试任务时,从控制台输出中看到了除零错误,大概是这样的 从上图中,通过分析,可以得出三个结论: 1. jenk ...

  9. Educational Codeforces Round 23D

    给n个数求每个子区间的价值,区间的价值是最大值-最小值 套路题= =,分别算最大值和最小值的贡献,用并查集维护,把相邻点连一条边,然后sort,求最大是按边价值(两个点的最大价值)小的排,求最小是按最 ...

  10. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...