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;
    }
    
  • 相关阅读:
    解决GET http://localhost:8080/js/layui/layui.js net::ERR_ABORTED 404
    按钮向右浮动
    @RequestParam、@PathVariable、 @RequestBody用法
    【报错】No converter found for return value of type: class java.util.HashMap
    Kendo UI for jQuery数据管理使用教程:PivotGrid
    界面控件DevExpress WPF——支持UI自动化和Appium测试
    Visual Studio插件CodeRush v20.2.9发布——新的单元测试体验
    DevExpress WinForms帮助文档:如何初始表单位置
    C# 8 & C# 9功能如何进行单元测试?这里有答案
    最新版Devexpress WinForm.NET开发环境配置信息
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/15074226.html
Copyright © 2011-2022 走看看