博客
关于我
【数论】异或
阅读量:374 次
发布时间:2019-03-04

本文共 789 字,大约阅读时间需要 2 分钟。

题目描述

SarvaTathagata是个神仙,一天他在研究数论时,书上有这么一个问题:求不超过n两两的数的gcd。

SarvaTathagata这么神仙的人当然觉得这个是sb题啦。学习之余,他还发现gcd的某一个特别好的性质:如果有两个数i,j满足gcd(i,j)=ij(这里的为c++中的异或)的话,那么这两个数组成的数对(i,j)就是一个nb的数对(这里认为(i,j)和(j,i)为相同的,并不需要计算2次)。

当然,SarvaTathagata并不会只满足于判断一个数对是否nb,他还想知道满足两个数都是不超过n并且nb的数对有多少个。

由于SarvaTathagata实在是太神仙了,他认为这种题实在是太简单了。于是他找到了你,看看你是否能解决这个问题。

输入

共一行一个整数n,含义如题所述。

输出

一行一个整数,表示nb的数对的个数。


Sample1-in
12
Sample1-out
8

Sample2-in
123456
Sample2-out
214394

思路

先设:a>b
根据异或的性质,我们可以发现a^b是会大于等于a-b的。(这个可以推一下)
然后gcd(a,b)会小于等于a-b;那么当a^b=gcd(a,b)时a ^b=a-b;
题目中我们可以枚举c = gcd(a,b),然后枚举它的倍数,使gcd(a,b)=a-b,然后和异或对比。

#include<cstdio>int n,ans;int main(){    scanf("%d",&n); for(int i = 1; i < n; ++i)  //枚举gcd(a,b)=b   for(int j = i+i; j <= n; j+=i)  //枚举倍数a     if((j^i) == j-i) ++ans;  //异或 printf("%d",ans);  //输出答案}

转载地址:http://mhkg.baihongyu.com/

你可能感兴趣的文章
Nacos做注册中心使用
查看>>
Nacos做配置中心使用
查看>>
Nacos入门过程的坑--获取不到配置的值
查看>>
Nacos原理
查看>>
Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
查看>>
Nacos启动异常
查看>>
Nacos命名空间配置_每个人用各自自己的命名空间---SpringCloud Alibaba_若依微服务框架改造---工作笔记001
查看>>
Nacos和Zookeeper对比
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos基础版 从入门到精通
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
查看>>
Nacos心跳机制实现快速上下线
查看>>
nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
查看>>
nacos服务提供和发现及客户端负载均衡配置
查看>>
Nacos服务注册与发现demo
查看>>
Nacos服务注册与发现的2种实现方法!
查看>>
nacos服务注册和发现原理简单实现案例
查看>>