• hdu 5175 Misaki's Kiss again


    Misaki's Kiss again

     
     Accepts: 75
     
     Submissions: 593
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    问题描述
    摩天轮后,一些朋友希望再次得到Misaki的吻,所以Misaki把他们分别编号从1到NN,如果他们中有人的编号是MM,而且gcd(N,M)=Ngcd(N,M)=N xor MM,那么他以可以得到一个吻。
    请帮助Misaki找到所有的MM..
    Note that:
    GCD(a, b)GCD(a,b) 表示aa和bb的最大公约数.
    A XOR BAXORB 表示AA异或BB.
    输入描述
    多组测试数据,
    对于每组测试数据只有一个数N(0 < N <= {10}^{10})N(0<N<=1010​​)
    输出描述
    第一行Case #x:
    第二行一个数count表示有多少个MM
    第三行有count个数,按升序输出,中间一个空格,表示具体的MM..
    输入样例
    3
    5
    15
    输出样例
    Case #1:
    1
    2
    Case #2:
    1
    4
    Case #3:
    3
    10 12 14
    Hint
    第三个样例:gcd(15,10)=5且(15 xor 10)=5, gcd(15,12)=3且(15 xor 12)=3,gcd(15,14)=1且(15 xor 14)=1

    注意到异或运算的特殊性,a^b=c,那么a^c=b;
    所以可以先求出n的所有约数,然后利用约数得到相应的m,再对gcd(n,m)==n^m进行判断
    注意由约数异或n得出的值可能为0或者大于n,要进行判断
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <vector>
    using namespace std;
    typedef long long LL;
    vector<LL>ans;
    LL kgcd(LL a,LL b)
    {
        if(a==0) return b;
        if(b==0) return a;
        if (!(a & 1) && !(b & 1)) return kgcd(a>>1, b>>1) << 1;
        else if (!(b & 1)) return kgcd(a, b>>1);
        else if (!(a & 1)) return kgcd(a>>1, b);
        else return kgcd(abs(a - b), min(a, b));
    }
    int main()
    {
        LL n,m,k,ca=1;
        while(~scanf("%I64d",&n))
        {
            ans.clear();
            for(LL i=1; i<=sqrt(n); i++)
            {
                if(n%i==0)
                {
                    m=n^i;
                    if(m>=1&&m<=n&&kgcd(m,n)==i) ans.push_back(m);
                    k=n/i;
                    if(k!=i)
                    {
                    m=n^k;
                    if(m>=1&&m<=n&&kgcd(m,n)==k) ans.push_back(m);
                    }
                }
            }
            sort(ans.begin(),ans.end());
            printf("Case #%I64d:
    %I64d
    ",ca++,ans.size());
            for(int i=0;i<ans.size();i++)
            {
                if(i!=0) printf(" ");
                printf("%I64d",ans[i]);
            }
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    【LOJ #2290】「THUWC 2017」随机二分图(状压DP)
    【LOJ #2136】「ZJOI2015」地震后的幻想乡(状压DP)
    【CSP-S 2019模拟】题解
    异步编程补漏
    Git(七) 查漏补缺
    ES6(二) let const
    ES6(一) 数组
    JS判断对象是否存在
    Git(六)
    Git(五)
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/5384076.html
Copyright © 2020-2023  润新知