GCD XOR UVA - 12716 ——筛法建立约数表+xor运算+数学规律

Think:
1埃式筛法思想建立约数表
2初始打表寻找运算的数学规律
3xor运算(不带进位的二进制加法)
运算法则

1. aa = 0
2. a ⊕ b = b ⊕ a
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.((a^b) == c <=> a(a^c) == b)
5. a ⊕ b ⊕ a = b.
6.若x是二进制数0101,y是二进制数1011;
则x⊕y=1110
只有在两个比较的位不同时其结果是1,否则结果为0
即“两个输入相同时为0,不同则为1”!

xor运算——百度百科链接

vjudge题目链接

以下为Accepted代码

/*
1打表发现数学规律gcd(a, b) == (a^b) => (a-b) == (a^b)
2筛法思想建立约数表
3xor运算:(a^b) = c <=> (a^c) = b;
*/
#include <cstdio>
#include <cstring>

using namespace std;

int v[30000004] = {0};

int main(){
    int a, b, c;
    ///筛法思想建立约数表
    for(c = 1; c <= 15000000; c++){
        for(a = c + c; a <= 30000000; a += c){
            b = a - c;
            if(c == (a^b))
                v[a]++;
        }
    }
    ///now:v[a]:(a, xi);
    for(int i = 2; i <= 30000000; i++){
        v[i] += v[i-1];
    }
    ///now:v[a]:(ai, xi);
    int T, k, n;
    scanf("%d", &T);
    for(k = 1; k <= T; k++){
        scanf("%d", &n);
        printf("Case %d: %d\n", k, v[n]);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值