【数论】SSL

xiaoxiao2025-04-15  13

题意

求出 1 ∼ N 1\sim N 1N中有多少个无序数对 ( a , b ) (a,b) (a,b) g c d ( a , b ) = a   x o r   b 。 gcd(a,b)=a\ xor\ b。 gcd(a,b)=a xor b

思路

c = g c d ( a , b ) = a   x o r   b c=gcd(a,b)=a\ xor\ b c=gcd(a,b)=a xor b ∵ a   x o r   b = c \because a\ xor\ b=c a xor b=c ∴ a   x o r   c = b \therefore a\ xor\ c=b a xor c=b ∴ g c d ( a , a   x o r   c ) = g c d ( a , b ) = a   x o r   b = c \therefore gcd(a,a\ xor\ c)=gcd(a,b)=a\ xor\ b=c gcd(a,a xor c)=gcd(a,b)=a xor b=c ∵ g c d ( a , b ) ≤ a − b , a   x o r   b ≥ a − b \because gcd(a,b)\leq a-b,a\ xor\ b\geq a-b gcd(a,b)ab,a xor bab ∴ c = a − b \therefore c=a-b c=ab ∴ b = a − c \therefore b=a-c b=ac ∴ g c d ( a , a − c ) = g c d ( a , b ) = c \therefore gcd(a,a-c)=gcd(a,b)=c gcd(a,ac)=gcd(a,b)=c ∵ g c d ( a , a   x o r   c ) = c \because gcd(a, a\ xor\ c)=c gcd(a,a xor c)=c ∴ a   x o r   c = a − c \therefore a\ xor\ c=a-c a xor c=ac 由设中我们知道 c c c a a a的约数,所以枚举 c c c再找出它的倍数 a a a

代码

#include<cstdio> #include<algorithm> using namespace std; int N, ans; int main() { scanf("%d", &N); for (int i = 1; i <= N / 2; i++) for (int j = i * 2; j <= N; j += i) if ((j - i) == (i ^ j)) ans++; printf("%d", ans); }
转载请注明原文地址: https://www.6miu.com/read-5028323.html

最新回复(0)