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.

浙公网安备 33010602011771号