zoukankan      html  css  js  c++  java
  • SSLOJ 1461.异或

    题目

    题目描述
    SarvaTathagata是个神仙,一天他在研究数论时,书上有这么一个问题:求不超过n两两的数的gcd。
    SarvaTathagata这么神仙的人当然觉得这个是sb题啦。学习之余,他还发现gcd的某一个特别好的性质:如果有两个数i,j满足gcd(i,j)=i ^ j(这里的^为c++中的异或)的话,那么这两个数组成的数对(i,j)就是一个nb的数对(这里认为(i,j)和(j,i)为相同的,并不需要计算2次)。
    当然,SarvaTathagata并不会只满足于判断一个数对是否nb,他还想知道满足两个数都是不超过n并且nb的数对有多少个。
    由于SarvaTathagata实在是太神仙了,他认为这种题实在是太简单了。于是他找到了你,看看你是否能解决这个问题。

    输入 共一行一个整数n,含义如题所述。 输出 一行一个整数,表示nb的数对的个数。 输入样例

    样例输入1:
    12
    样例输入2:
    123456

    样例输出1:
    8
    样例输出2:
    214394

    说明 提示
    样例1中共有八对,分别是:
    {2,3},{4,5},{4,6},{6,7},{8,9},{8,10},{8,12},{10,11}

    分析

    注意,在这里a>b, “ ^ ”表示异或(xor)

    容易证明: 当gcd(a,b) = a ^ b时,gcd(a,b) = a-b = a ^ b:
    1.gcd(a,b) <= a - b(应该很容易理解):
    设gcd(a,b) = k , a' = a / k , b' = b / k
    a - b = a' k + b' k = k(a' - b')
    又∵ a > b
    ∴ a' > b'
    又∵ a , b ∈ Z
    ∴a' - b' >= 1
    ∴k <= a-b
    即gcd(a,b) <= a-b
    2.a ^ b >= a - b
    首先,异或是按位的,没有进退位
    对比一下:

    0 xor 1 = 1 0 - 1 = 1 (需要从前面借1 , 小于异或)
    1 xor 0 = 1 1 - 0 = 0(相等于异或)
    1 xor 1 = 0 1-1 = 0(相等于异或)
    0 xor 0 = 0 0 - 0 = 0(相等于异或)
    所以,a ^ b >= a - b
    综上,gcd(a,b) <= a - b <= a ^ b
    又∵gcd(a,b) = a ^ b
    ∴gcd(a,b) = a-b = a ^ b

    =============== 分割线 ==========================
    设c = a-b 则b = a-c
    gcd(a,b) = gcd(a,a-b) = gcd(a,c)(详见更相减损术

    重点来了:
    当a-c = a^c时
    b = a^c
    b ^ b = a ^ b ^ c
    0 = a ^ b ^ c
    即a ^ b = c
    又∵c = a - b = gcd(a,b)
    ∴gcd(a,b) = a - b = a ^ b

    因此,只要满足a-c = a ^ c,就有gcd(a,b) = a ^ b,我们枚举a,c即可
    又∵gcd(a,b) = gcd(a,c) = a - b = c
    ∴a是c的整数倍

    代码

    #include <iostream>
    using namespace std;
    int main(){
    	int n , ans = 0;
    	cin >> n;
    	for(int c = 1 ; c <= n ; c++)//枚举c
    		for(int a = (c << 1) ; a <=n ; a += c)//枚举c的倍数,即a
    			if(a - c == (a ^ c)){
    				ans += 1;
    			}
    	cout << ans;
    	return 0;
    }
    
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/dream1024/p/13957465.html
Copyright © 2011-2022 走看看