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;
    }
    
  • 相关阅读:
    Linux Virtual Server技术
    log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)
    Android控件ToggleButton的使用方法
    Redis学习手冊(事务)
    游戏server之server优化思路
    Codeforces 474D Flowers (线性dp 找规律)
    【C语言】编写函数实现库函数atof
    unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发
    [WebGL入门]二十一,从平行光源发出的光
    TwoSum leetcode
  • 原文地址:https://www.cnblogs.com/dream1024/p/13957465.html
Copyright © 2011-2022 走看看