P1446 [HNOI2008]Cards
题目描述
小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.
进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绿色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.
Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).
输入输出格式
输入格式:
第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。接下来 m 行,每行描述一种洗牌法,每行有 n 个用空格隔开的整数 X1X2...Xn,恰为 1 到 n 的一个排列,表示使用这种洗牌法,第 i位变为原来的 Xi位的牌。输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种
洗牌法,都存在一种洗牌法使得能回到原状态。
100%数据满足 Max{Sr,Sb,Sg}<=20。
输出格式:
不同染法除以P的余数
输入输出样例
说明
有2 种本质上不同的染色法RGB 和RBG,使用洗牌法231 一次可得GBR 和BGR,使用洗牌法312 一次 可得BRG 和GRB。
分析:
先学习下几个引理
burnside引理
http://blog.csdn.net/liangzhaoyang1/article/details/72639208
逆元
https://www.cnblogs.com/linyujun/p/5194184.html
参考了大神博客
http://tgotp.science/
思路:套用burnside引理,这题因为对颜色有限制 不能用 polya ,用动归求出对于一个置换的不动方案数 ;
dp的一些解释:dp[i][j][k]表示前i个循环, 用了1号颜色j个 2号颜色k个的方案数
num[n]表示该洗牌法下的循环节个数;
最后根据burnside引理:
不同的方案数:I=(C(a1)+C(a2)+...C(ag))/G
这题的情况是需要除以m
但是过程中我们都进行的%p
且(a / b) % p = (a%p / b%p) %p 是错误的,所以我们要用到逆元(这题因为p是质数,用费马小定理就行)
(a / b) % p = (a * inv(b) ) % p = (a % p * inv(b) % p) % p
费马小定理
a^(p-1) ≡1 (mod p)
所以 inv(a) = a^(p-2) (mod p)
// 去吧!皮卡丘! 把AC带回来!
// へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// イ● 、 ● ⊂⊃〈 /
// () へ | \〈
// >ー 、_ ィ │ //
// / へ / ノ<| \\
// ヽ_ノ (_/ │//
// 7 |/
// >―r ̄ ̄`ー―_
//**************************************
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
template <class T> inline T min(T a, T b, T c, T d) {
return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d) {
return max(max(a, b), max(c, d));
}
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
const int maxn = 3e5 + ;
const int maxx = 1e6 + ;
// name*******************************
int dp[][][];
int a[];
bool flag[];
int num[];
int s1, s2, s3, m, mod;
int tot;
int ans = ;
int sum[];
// function******************************
inline ll qmul(ll a, ll b) {
ll base = a, ans = ;
while (b) {
if (b & 1ll)
ans = (ans * base) % mod;
base = (base * base) % mod;
b >>= 1ll;
}
return ans;
}
//***************************************
int main() {
// ios::sync_with_stdio(0); cin.tie(0);
// freopen("test.txt", "r", stdin);
// freopen("outout.txt","w",stdout);
cin >> s1 >> s2 >> s3 >> m >> mod;
m++;
tot = s1 + s2 + s3;
For(t, , m) {
if (t == m)
For(i, , tot) a[i] = i;
else
For(i, , tot) cin >> a[i];
memset(flag, , sizeof(flag));
memset(num, , sizeof(num));
memset(sum, , sizeof(sum));
int n = ;
For(j, , tot) {
if (!flag[j]) {
int cnt = ;
int p = j;
while (!flag[p]) {
flag[p] = ;
cnt++;
p = a[p];
}
num[++n] = cnt;
sum[n] = sum[n - ] + cnt;
}
}
dp[][][] = ;
For(i, , n) {
For(j, , s1) {
For(k, , s2) {
int l = sum[i] - j - k; //?
if (l < || l > s3)
continue;
int sum = ;
if (j >= num[i])
sum = (sum + dp[i - ][j - num[i]][k]) % mod;
if (k >= num[i])
sum = (sum + dp[i - ][j][k - num[i]]) % mod;
if (l >= num[i])
sum = (sum + dp[i - ][j][k]) % mod;
dp[i][j][k] = sum;
if (i == n)
ans = (ans + dp[i][j][k]) % mod;
}
}
}
}
int x = ans * qmul(m, mod - ) % mod;
cout << x;
return ;
}
P1446 [HNOI2008]Cards的更多相关文章
- 洛谷 P1446 [HNOI2008]Cards 解题报告
P1446 [HNOI2008]Cards 题目描述 小春现在很清闲,面对书桌上的\(N\)张牌,他决定给每张染色,目前小春只有\(3\)种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun ...
- luogu P1446 [HNOI2008]Cards
题目链接 luogu P1446 [HNOI2008]Cards 题解 题意就是求染色方案->等价类 洗牌方式构成成了一个置换群 然而,染色数限制不能用polay定理直接求解 考虑burnsid ...
- luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点
LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...
- 洛谷P1446 [HNOI2008]Cards
置换群+dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring& ...
- 【bzoj1004】[HNOI2008]Cards
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2928 Solved: 1754[Submit][Sta ...
- bzoj 1004 1004: [HNOI2008]Cards burnside定理
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1668 Solved: 978[Submit][Stat ...
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...
- 【BZOJ1004】[HNOI2008]Cards Burnside引理
[BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...
- 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)
1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很 ...
随机推荐
- Yii CGridView 关联表搜索排序实例
在这篇文章中,我准备讲解如何在CGridView中搜索或者排序关联表中的某一行,通过给Yii Blog demo添加一个list页面. 首先,检查你的blog demo里的protected\mode ...
- 【PyQt5 学习记录】008:改变窗口样式之二
super(MainWindow, self).__init__(parent, flags=Qt.Widget) 首先需要关闭窗口的默认样式,以方便定时想要的样式: self.setWindowFl ...
- 【代码笔记】iOS-iOS图片的原生(Graphics)
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- iview里select组件搜索后选中的数据和展示内容不一样
原因:option上的key设置的不唯一 保证key的值唯一
- Ubuntu 添加删除用户 How to Add and Delete Users on Ubuntu 16.04
Introduction One of the most basic tasks that you should know how to do on a fresh Linux server is ...
- flutter控件之CheckBox
import 'package:flutter/material.dart'; class LearnCheckBox extends StatefulWidget{ @override State& ...
- Oracle官网登录下载资源账号密码共享
Oracle帐号:2696671285@qq.com Oracle密码:Oracle123 可爱博主:AlanLee 博客地址:http://www.cnblogs.com/AlanLee 本文出自博 ...
- Azure 镜像市场虚拟机映像制作指南
本指南为 Azure 镜像市场(以下简称 Azure 镜像市场)独立软件供应商介绍制作虚拟机映像并上传到Azure的主要过程. 制作虚拟机映像有两种方式.一种是直接在Azure上申请相应的操作系统虚拟 ...
- Vue2学习笔记:事件对象、事件冒泡、默认行为
1.事情对象 <!DOCTYPE html> <html> <head> <title></title> <meta charset= ...
- l2dct
http://paste.ubuntu.com/15664711/ diff -crbB ns-allinone-2.35/ns-2.35/queue/red.cc ns-2.35/queue/red ...