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.
本文探讨了在给定正整数n的范围内,寻找满足特定条件的无序数对(a,b)的方法。通过设定a>b且gcd(a,b)=a xor b,采用枚举策略并利用数学性质简化问题,实现时间复杂度为O(n log n)的有效解决方案。
187

被折叠的 条评论
为什么被折叠?



