zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    从当前url替换获得新的url
    访问者模式
    备忘录模式
    make makefile cmake qmake 区别
    qt编译过程
    tensorflow前处理
    tesorflow操作
    tensorflow的object_detection安装
    tensorflow 编译与训练
    tensorflow后处理
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/15074226.html
Copyright © 2011-2022 走看看