一本通 P1801 异或

Posted wangjunrui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通 P1801 异或相关的知识,希望对你有一定的参考价值。

一本通原题

因为(?? = ??)时肯定无解,我们不妨设(?? > ??)
那么有(gcd(a,b)leq a-b), (a xor bgeq a-b),很明显有(?? = ?? ? ??)
我们依然 枚举(c), (a=i*c),因为(gcd(a,a-c)=c)
所以我们只需判断(a xor c=a-c)即 可,时间(O(n log_2n)),因为常数小,所以可以过。

#include<cstdio>
#define re register
using namespace std;
template<typename T>
inline void read(T&x)
{
    x=0;
    char s=getchar();
    bool f=false;
    while(!(s>='0'&&s<='9'))
    {
        if(s=='-')
            f=true;
        s=getchar();
    }
    while(s>='0'&&s<='9')
    {
        x=(x<<1)+(x<<3)+s-'0';
        s=getchar();
    }
    if(f)
        x=(~x)+1;
    return;
}
int ans,n;
int main()
{
    read(n);
    for(re int i=1; i<=n; i++)
        for(re int j=i<<1; j<=n; j+=i)
            ans+=(i^j)==j-i;
    printf("%d
",ans);
    return 0;
}

以上是关于一本通 P1801 异或的主要内容,如果未能解决你的问题,请参考以下文章

一本通1154:亲和数

一本通题1051

一本通1058:求一元二次方程

信息学奥赛一本通要多少钱

一本通题库1111

重刷信奥赛一本通日记-2