1 条题解

  • 0
    @ 2025-8-24 22:54:02

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar T_TLucas_Yin
    周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上线周末上

    搬运于2025-08-24 22:54:02,当前版本为作者最后更新于2024-01-01 10:36:49,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目大意:给定 nn ,求出 nn11nn 中所有数的最大公约数的异或和。

    看到数据范围,很容易发现这是个典型的结论题。所以直接开始找规律。

    对于求最大公约数,有一种方法叫做更相减损术。其中用到了这样一条规律:

    gcd(a,b)=gcd(ba,b)\gcd(a,b)=\gcd(b-a,b)

    改一下字母就可得

    gcd(i,n)=gcd(ni,n)\gcd(i,n)=\gcd(n-i,n)

    我们又知道,异或和运算满足 abc=acba \oplus b \oplus c = a \oplus c \oplus baa=0a \oplus a = 0

    也就是说,对于所有 1i<n1\le i < n,我们可以把每一对 gcd(i,n)\gcd(i,n)gcd(ni,n)\gcd(n-i,n) 放到一起,这样,它们的异或和就会抵消为 00

    接下来看整个式子。若 nn 为奇数,则两两抵消后,会剩下 gcd(n,n)\gcd(n,n) ,也就是 nn 。由于除此之外整个式子都为 00,所以最终的结果就是 nn

    nn 为偶数,则两两抵消后,会剩下 gcd(n2,n)\gcd(\frac n 2,n)gcd(n,n)\gcd(n,n) 两项,它们的值刚好分别为 n2\frac n 2nn ,因此最终的结果就是它们的异或和。

    #include<bits/stdc++.h>
    using namespace std;
    long long t,n;
    int main(){
        cin>>t;
        while(t--){
            cin>>n;
            if(n&1) printf("%lld\n",n);// n&1就是n%2==1
            else printf("%lld\n",(n/2)^n);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    9429
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者