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.