SDOI2009 E&D

题目描述

题解:

2e9的博弈肯定要先打表找规律。

求$SG$函数就不说了,直接上表。

乍一看看到了一堆$0$。

仔细一看发现每个$2*2$的方框中只有左上是$0$,其余是同一个数字。

然后增大间隔打表,发现……

代码:

#include<cstdio>
const int N = 20050;
template<typename T>
inline void read(T&x)
{
    T f = 1,c = 0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
    x = f*c;
}
int T,n;
int cal(int x,int y)
{
    int ret = 0;
    while(!((x&y)&1))
    {
        if(x&1)x++;
        if(y&1)y++;
        x>>=1,y>>=1;
        ret++;
    }
    return ret;
}
int main()
{
    read(T);
    while(T--)
    {
        read(n),n/=2;
        int ans = 0;
        for(int a,b,i=1;i<=n;i++)
        {
            read(a),read(b);
            ans^=cal(a,b);
        }
        puts(ans?"YES":"NO");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10306592.html

### 算法概述 P2152 [SDOI2009] SuperGCD 是一道要求实现高效计算两个大整数最大公约数(GCD)的题目。传统的欧几里得算法在处理大整数时由于模运算的效率问题可能表现不佳,因此需要使用更高效的算法。Stein算法(又称二进制GCD算法)是一种替代方案,它仅使用位移、加减法,避免了模运算,从而在某些场景下提高了性能。 ### Stein算法的核心思想 1. **基本性质**: - $ \text{gcd}(a, a) = a $,即一个数其自身的最大公约数是其本身。 - $ \text{gcd}(ka, kb) = k \cdot \text{gcd}(a, b) $,即最大公约数运算倍乘运算可以交换。 - 当 $ k $ $ b $ 互质时,$ \text{gcd}(ka, b) = \text{gcd}(a, b) $,即可以移除两个数中仅一个含有的因子而不影响结果。 2. **算法步骤**: - 如果两个数都是偶数,则最大公约数一定包含因子2,因此可以同时除以2。 - 如果一个数是偶数,另一个是奇数,则偶数的因子2不影响最大公约数,可以将其除以2。 - 如果两个数都是奇数,则使用更相减损术,即用较大数减去较小数,然后继续处理,直到其中一个数为0。 3. **终止条件**: - 如果其中一个数为0,则另一个数即为最大公约数。 - 如果两个数相等,则该数即为最大公约数。 ### Python实现 以下是一个基于上述思想的Python实现,适用于处理非常大的整数: ```python def super_gcd(a, b): if a == 0: return b if b == 0: return a shift = 0 while ((a | b) & 1) == 0: # 检查a和b是否都为偶数 a >>= 1 b >>= 1 shift += 1 while (a & 1) == 0: # 如果a是偶数,将其除以2 a >>= 1 while b != 0: while (b & 1) == 0: # 如果b是偶数,将其除以2 b >>= 1 if a > b: a, b = b, a b -= a return a << shift # 最后将结果乘以2^shift # 示例输入 a = int(input()) b = int(input()) print(super_gcd(a, b)) ``` ### 相关问题 1. 如何在C++中实现Stein算法来计算两个大整数的最大公约数? 2. 在P2152题中,为什么传统的欧几里得算法在处理大整数时效率较低? 3. 如何优化Python中的大整数最大公约数计算以满足竞赛时间限制? 4. Stein算法在哪些情况下优于欧几里得算法? 5. 如何在Python中高效处理非常大的整数进行模运算和位运算?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值