cf round 482E Kuro and Topological Parity

题意:一个长度为$n$的序列,一些地方是$0$,一些地方是$1$,$-1$的地方你可以选择填$0$或者$1$,你可以选择连一些边$x->y$满足$x<y$

请问有多少种填数并连边的方法,使得交错路的个数的奇偶性是$p$

$n \leq 50$

5维dp,可以减一维

原本的5维分别是:现在考虑的是第几个位置,当前有多少个以1为结尾的长度为偶数的交错路,当前有多少个以1为结尾的长度为奇数的交错路

当前有多少个以0为结尾的长度为偶数的交错路,当前有多少个以0为结尾的长度为奇数的交错路

dp的值是方案数

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=50+7;
const ll mod=1e9+7;
ll n,Px,col[maxn],mi[maxn],ans;
ll dp[maxn][maxn][maxn][maxn],C[maxn][maxn],Cd[2][maxn];//black,0/1,white,0/1

char cc; ll ff;
template<typename T>void read(T& aa) {
	aa=0;cc=getchar();ff=1;
	while((cc<‘0‘||cc>‘9‘)&&cc!=‘-‘) cc=getchar();
	if(cc==‘-‘) ff=-1,cc=getchar();
	while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
	aa*=ff;
}

int main() {
	read(n); read(Px);
	For(i,1,n) read(col[i]);
	C[0][0]=1;
	For(i,1,n) {
		C[i][0]=1;
		For(j,1,i) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	For(i,0,n) {
		For(j,0,i) Cd[j&1][i]+=C[i][j];
		Cd[0][i]%=mod; Cd[1][i]%=mod;
	}
	mi[0]=1; For(i,1,n) mi[i]=mi[i-1]*2%mod;
	dp[0][0][0][0]=1; ll r,x;
	For(i,1,n) For(j,0,i) For(k,0,i-j) For(t,0,i-j-k) {
		r=i-j-k-t;
		if(col[i]!=1&&j+k>0) {//black,0/1
			x=mi[j+k-1]*mi[t]%mod;
			if(j) //black,0
				dp[i][j][k][t]+=x*dp[i-1][j-1][k][t]%mod*Cd[1][r]%mod;
			if(k) //black,1
				dp[i][j][k][t]+=x*dp[i-1][j][k-1][t]%mod*Cd[0][r]%mod;
		}
		if(col[i]!=0&&t+r>0) {
			x=mi[t+r-1]*mi[j]%mod;
			if(t) //white,0
				dp[i][j][k][t]+=x*dp[i-1][j][k][t-1]%mod*Cd[1][k]%mod;
			if(r) //white,1
				dp[i][j][k][t]+=x*dp[i-1][j][k][t]%mod*Cd[0][k]%mod;
		}
		dp[i][j][k][t]%=mod;
		if(i==n&&((k+r)&1)==Px) ans+=dp[i][j][k][t];
	}
	printf("%lld\n",ans%mod);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Serene-shixinyi/p/9094435.html

时间: 2024-08-30 16:23:48

cf round 482E Kuro and Topological Parity的相关文章

cf round 482D Kuro and GCD and XOR and SUM

题意: 开始有个空集合,现在有两种操作: $(1,x)$:给集合加一个数$x$,$x \leq 10^5$; $(2,x,k,s)$:在集合中找一个$a$,满足$a \leq s-x$,而且$k|gcd(a,x)$:现在需要找满足条件的$a$,它异或$x$的值最大.$x,k,s \leq 10^5$ 操作数$q \leq 10^5$ 这道题就是看你想到一个算法有没有去算算实际复杂度 我们发现,对于所有在$[1,10^5]$的$i$,$10^5$之内的$i$的倍数的个数和,并不是很大,只有$2*1

CF Round 594

CF Round 594(Div1) (A~D)简要题解 开学基本打不了cf了啊.. A Ivan the Fool and the Probability Theory 对于 $ 1 \times n $ 的情况,稍微推一推式子发现是斐波那契数列的两倍(因为第一个位置可以是0可以是1,就是两倍了,否则是一倍). 考虑第一行,第一行有两种情况: 如果第一行是 01010... 交错的,那么 0 开头可以看成一种颜色,1 开头可以看成一种颜色.然后就成了一个竖着的 $ 1 \times n $ 的

CF Round #629

CF Round #629 A.数学 给定a,b,现在问你最小让a加多少使得a能被b整除,可以为0 即算(b-(a%b))%b B.数学 给定n和k 问以n-2个a和2个b组成的串中,以字典序升序排列,问第k个是几 这个有点类似康托展开,这个简化了很多 首先考虑第一个b,它处在从左往右数第p位,那么无论第二个b怎么放,它最大是(p-1)*p/2 所以只要找到第一个b为u,第二个b从u-1开始,每往后移一位就小一,找k即可 C.数学 给定n和x x是一串开头必为2,由0,1,2组成的字符串,一共有

cf Round#273 Div.2

题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一次在10分钟内过题 判平均数,且注意b为正 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int res = 0,n; 6 for(int i = 0; i < 5; i++) 7 { 8 cin>>

BestCoder Round #35(DZY Loves Topological Sorting-堆+贪心)

DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 323    Accepted Submission(s): 86 Problem Description A topological sort or topological ordering of a directed gr

【codeforces】【比赛题解】#915 Educational CF Round 36

虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Educational Round打的还可以,虽然吧没有涨分(因为我是紫色的啊). 做了前4题,后面3题也比较简单,陆续也做完了. 所以心情好,来写一篇题解! [A]花园 题意: 长度为\(k\)的线段,用若干个长度为\(a_i\)的线段,正好覆盖.(\(a_i|k\)) 给定\(n\)个\(a_i\),求出最小的\

【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做"真分数"当且仅当其分子小于分母,而一个分数被叫做"最简分数"当且仅当其分子分母互质.在闲暇时间,Petya在用计算器研究:如何把最简真分数转换为小数等问题.有一天他不小心把除号(÷)按成了加号(+),导致他得到了分子与分母的和.Petya想要得到他原来的分数,但他很快发现这不是唯一的.所以现在他想要知道最大的最简真分数使得其分子与分母的和为n. 输入

cf Round 613

A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个点距离多边形边缘最远的距离形成的圆面积减去这个点距离多边形边缘最近的距离形成的圆面积.我们可以得出距离最远的点一定是多边形的顶点.而距离最近的点不一定是多边形的顶点,但是在多边形的边上.我们用勾股定理判断点与每条边形成的三角形的两边角.如果有一个边角是钝角,则表示距离最近的点是顶点.如果都是锐角,则

【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

cf的比赛越来越有难度了--至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航,它们又是否会破灭呢?" 给定一个长度为n的序列.确定能不能将序列分成奇数个长度为奇数的非空字串,而且这其中每个子串以奇数开头,以奇数结尾.可以只分成一个(1也是奇数). 输入 第一行一个正整数n,表示序列长度. 第二行n个整数,表示序列中的元素. 输出 输出"Yes"或"