GCD和XOR题解

由题意

我们要统计1~N中有多少二元组(a,b)满足gcd(a,b) ==a XOR b



首先有如下性质:

1.a XOR b >= a-b  (a >= b)

证明:(给个简单的证明 OI证明都不严谨的)

在二进制下

a XOR b :b某一位的1才对答案有影响,如果a那位为1那就相当于减,为0相当于加

a 减     b: 同样b的某一为的1才对答案影响,且a的那一位不管是0还是1,都是减

所以 a XOR b 一定 >= a-b

2. a - b >= gcd( a,b )

证明:

设gcd(a,b)=c

则a=c*x1,b=c*x2(x1,x2互质且大于等于1)x1>=x2

a - b = c*(x1 -x2)>= c



所以a XOR b >= a-b >= gcd(a,b)

而  a  XOR b=gcd(a,b)

所以a XOR b = a - b = gcd (a,b)



到这里解法应该就有很多了,我只分享第一次想到的懒

令 gcd(a,b)=d,a=d*x1 ,b=d*x2

由上述等式得x1-x2=1;

所以我们外层枚举d,内层枚举b,(a直接得到),然后判断a XOR b 是否等于 a  - b

代码如下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=3e7;
 4 int c[N+9];//c[i]表示i与1~i-1中共有多少对满足
 5 void pre(){
 6     for(int d=1;d<=N;d++){
 7         for(int b=d;b<=N-d;b+=d){
 8             int a=b+d;
 9             if((a^b)==(a-b))c[a]++;
10         }
11     }
12     for(int i=1;i<=N;i++)c[i]+=c[i-1];//求出前缀和
13 }
14 void work(){
15     int T,n;
16     scanf("%d",&T);
17     for(int i=1;i<=T;i++){
18         scanf("%d",&n);
19         printf("Case %d: %d\n",i,c[n]);
20     }
21 }
22 int main(){
23     pre();
24     work();
25     return 0;
26 } 

原文地址:https://www.cnblogs.com/zrqlj/p/11413986.html

时间: 2024-11-06 12:26:42

GCD和XOR题解的相关文章

D. Kuro and GCD and XOR and SUM

Kuro is currently playing an educational game about numbers. The game focuses on the greatest common divisor (GCD), the XOR value, and the sum of two numbers. Kuro loves the game so much that he solves levels by levels day by day. Sadly, he's going o

Codeforces Round #482 (Div. 2)D. Kuro and GCD and XOR and SUM+字典树

题目链接:D. Kuro and GCD and XOR and SUM 题意:两种操作:第一种给数组添加一个数,第二种输入x,k,s,要求从数组中找到一个数v,要求k能整除gcd(k,v);并且v<=s-x,然后异或v与k的异或值最大. 题解:对与k大于1的情况我们暴力枚举过去,k为1的特殊处理建一颗字典树,如果可以的满足条件的话,每次取值时往相反方向取. 1 #include<bits/stdc++.h> 2 #include <iostream> 3 #include

CF 979D Kuro and GCD and XOR and SUM(异或 Trie)

CF 979D Kuro and GCD and XOR and SUM(异或 Trie) 给出q(<=1e5)个操作.操作分两种,一种是插入一个数u(<=1e5),另一种是给出三个数x,k,s(<=1e5),求当前所有数中满足,k|v,x+v<=s,且\(x\oplus v\)最大的v. 做法好神啊.关于异或的问题有一种常见做法,就是利用01trie来查找在一堆数里面,那个数与x的异或值最大.这道题就是这个思路.如果去掉k必须整除v这个条件,那么就转化成了上一个问题(只不过有最大

[UVA-12716] GCD XOR 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接(vjudge):https://vjudge.net/problem/UVA-12716 题目大意: 输入一个数字t,表示数据组数. 接下来t行,每行给出一个整数n(1<=n<=30000000),问有多少对整数a,b(1<=b<=a<=n),满足gcd(a,b) = a^b. 对于每个n,输出Case x: y,表示当前是第x组数据,结果是y. Sample Input 2 7 20000000

【UVA12716】GCD和XOR

题意 输入整数n(1<=n<=3*107),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b.例如:n=7时,有4对:(3,2),(5,4),(6,4),(7,6) 分析 本题的主要想法就是找到一个沟通gcd(a,b)和a^b的桥梁 a^b≥a-b.口头化证明:假如二进制位上相同,那么都是0,加入二进制位上不同,前者一定是1,后者可能是1(1-0),也有可能借位导致数位减少(0-1) a-b≥gcd(a,b).由九章算术·更相减损术可得gc

例题10-5 GCD等于XOR UVa12716

1.题目描述:点击打开链接 2.解题思路:本题能用的判断条件只有两个:(1)gcd(a,b)=c:(2)(a^b)=c:通过观察容易发现如果gcd(a,b)=(a^b)=c,那么c=a-b,因此可以事先枚举所有a的因数c,利用b=a-c计算b,然后只需验证是否满足(a^b)==c即可.但本题的数据太大,而且枚举约数不容易,因此可以利用约数c枚举倍数a,这样就会方便很多,打表的效率也足够高:而且,由于a=k*c,b=a-c=(k-1)*c,因此,必有gcd(a,b)=gcd(k*c,(k-1)*c

cf round 482D Kuro and GCD and XOR and SUM

题意: 开始有个空集合,现在有两种操作: $(1,x)$:给集合加一个数$x$,$x \leq 10^5$; $(2,x,k,s)$:在集合中找一个$a$,满足$a \leq s-x$,而且$k|gcd(a,x)$:现在需要找满足条件的$a$,它异或$x$的值最大.$x,k,s \leq 10^5$ 操作数$q \leq 10^5$ 这道题就是看你想到一个算法有没有去算算实际复杂度 我们发现,对于所有在$[1,10^5]$的$i$,$10^5$之内的$i$的倍数的个数和,并不是很大,只有$2*1

HDU3949:XOR——题解

http://acm.hdu.edu.cn/showproblem.php?pid=3949 求n个数的异或和第k小. 参考:https://blog.sengxian.com/algorithms/linear-basis 没了. #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<algorithm> using namespace s

BZOJ2115:[WC2011]Xor——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=2115 https://www.luogu.org/problemnew/show/P4151 这道题当年还是新题,现在都成线性基套路题了. 参考:https://blog.sengxian.com/algorithms/linear-basis 一个1~n路径值可以拆成一条1~n的路径值^几个环(因为去到环和回来的路的值被异或回去了). 于是就变成了处理出所有环的异或值和所有1~n的无环路的异或