[AGC043B] 123 Triangle

前言

又是一道妙妙题。

题目

洛谷

AtCoder

讲解

胡思乱想

其实这道题拿到的时候我就想,这 (a_iin[1,3]) 肯定有东西,那么答案肯定在 ([0,3]) 中啊。

所以我们每个点有 ( equire{enclose}enclose{horizontalstrike}{frac{1}{4}}) 的概率猜对,如果运气好一点...

正解

当然我们要从值域入手。

我们玩过一轮之后就可以发现 (3) 不复存在,因为 (3) 要留下来必须要有 (0),而第一行是没有 (0) 的。

猜对的概率大大提高!

现在的值域为 ([0,2]),我们发现 (1) 左拥右抱,很特殊啊。

事实确实是这样的,因为 (1) 不论和 (0) 还是 (2) 组合,下一行都是 (1),所以我们分类讨论。

存在 (1)

存在 (1) 的情况答案一定是 (1)?并不是。

因为全 (1) 的情况会变成全 (0),此时 (1) 没了。

但除了这样就没有消掉 (1) 的方法了,所以我们得出 (2) 一定不存在,并且我们发现 (2) 的效果其实和 (0) 是一样的,都是为了凑 (1) 然后试图推翻 (1) 的政权,使 (0) 上位。

所以我们直接把 (2) 当作 (0) 考虑。

现在的值域为 ([0,1]),我们发现此时减法和加法在绝对值里面是等价的,所以我们不妨直接改成加法,改成加法之后显然就是一个组合数的形式,而且是 (mod 2) 意义下的。

所以我们就可以用组合数直接算出最后的答案是 (1) 还是 (0) 了,类似于统计每个 (1) 对答案的贡献。

不存在 (1)

其实值域为 ({0,2}) 和值域为 ([0,1]) 没有本质区别,当成 ([0,1]) 做即可。

代码

戳我
//12252024832524
#include <cstdio>
#include <cstring>
#include <algorithm>
#define TT template<typename T>
using namespace std; 

typedef long long LL;
const int MAXN = 1000005。;
const int MOD = 2;
int n,ans;
int a[MAXN];

LL Read()
{
	LL x = 0,f = 1;char c = getchar();
	while(c > '9' || c < '0'){if(c == '-')f = -1;c = getchar();}
	while(c >= '0' && c <= '9'){x = (x*10) + (c^48);c = getchar();}
	return x * f;
}
TT void Put1(T x)
{
	if(x > 9) Put1(x/10);
	putchar(x%10^48);
}
TT void Put(T x,char c = -1)
{
	if(x < 0) putchar('-'),x = -x;
	Put1(x); if(c >= 0) putchar(c);
}
TT T Max(T x,T y){return x > y ? x : y;}
TT T Min(T x,T y){return x < y ? x : y;}
TT T Abs(T x){return x < 0 ? -x : x;}

int C(int x,int y){return (x&y) == y;}
int gc()
{
	char c = getchar();
	while(c > '9' || c < '0') c = getchar();
	return c - '0';
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read();
	for(int i = 1;i <= n;++ i) a[i] = gc();
	bool f = 0;
	for(int i = 1;i < n;++ i) 
	{
		a[i] = Abs(a[i]-a[i+1]);	
		if(a[i] == 1) f = 1;
	}
	if(n == 2) {Put(a[1]);return 0;}
	if(f)
	{
		for(int i = 1;i < n;++ i)
			if((a[i] & 1) && C(n-2,i-1)) ans ^= 1;
		Put(ans);
		return 0;
	}
	for(int i = 1;i < n;++ i) if(a[i] && C(n-2,i-1)) ans ^= 1;
	Put(ans * 2);
	return 0;
}
原文地址:https://www.cnblogs.com/PPLPPL/p/15074226.html