5197. 【NOIP2017提高组模拟7.3】C (Standard IO)

Description

给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。
 

Input

输入共一行,一个正整数n。
 

Output

输出共一行,一个正整数表示答案。
 

Solution

因为𝑎 = 𝑏时肯定无解,我们不妨设𝑎 > 𝑏。
那么有gcd(𝑎, 𝑏) ≤ 𝑎 − 𝑏, 𝑎 𝑥𝑜𝑟 𝑏 ≥ 𝑎 − 𝑏,很明显有𝑐 = 𝑎 − 𝑏。
我们依然 枚举𝑐, 𝑎 = 𝑖 ∗ 𝑐,因为gcd(𝑎, 𝑎 − 𝑐) = 𝑐,
所以我们只需判断𝑎 𝑥𝑜𝑟 𝑐 = 𝑎 − 𝑐即 可,时间O(𝑛 log 𝑛)。
 
代码
 1 var
 2   n,ans:longint;
 3 procedure main;
 4 var
 5   i,j,k:longint;
 6 begin
 7   ans:=0; i:=1;
 8   while i<n do
 9     begin
10       k:=n div i;
11       for j:=2 to k do
12         if (i*j) xor i=i*(j-1) then
13           inc(ans);
14       inc(i);
15     end;
16 end;
17 
18 begin
19   readln(n);
20   main;
21   writeln(ans);
22 end.

 

posted @ 2018-08-15 15:38  猪都哭了  阅读(282)  评论(0)    收藏  举报