GCD等于XOR GCD XOR
题面翻译
输入数据组数t,接下来t行每行给定一个数字n,如样例所示格式输出满足1<=b<=a<=n且gcd(a,b)==a xor b的(a,b)二元组个数。
translated by @AdzearDisjudge
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
2
7
20000000
样例输出 #1
Case 1: 4
Case 2: 34866117
分析
题目是让我们求满足:1<=b<=a<=n且gcd(a,b)==a xor b 的对数(a,b)。
首先,我们要知道异或的以下几个公式:
- 如果 a xor b = x,那么 a xor x = b
- a - b <= a xor b(a - b >= 0,即 a >= b)
- 如果 a xor b =x,那么 a - b <= x (a,b条件同上)
题目说 gcd(a,b)= a xor b = x (a >= b),则a - b <= x。
我们令 a=x * X , b=x * Y (X>=Y)
a-b得:a - b = (X - Y)× x
∵ X>=Y,∴ a - b >= x
结合公式3,得:a-b = x
又∵x = a xor b,∴a-b = a xor b
后面直接枚举+判断就行啦~~
代码
#include <bits/stdc++.h>
using namespace std;
int sum[100000000];
void aa(int n)//先预处理
{
int k=n/2;
for(int b=1;b<=k;b++)//枚举
{
for(int a=2*b;a<=n;a=a+b)
{
if((a - b)==(a xor b))//判断
{
sum[a]++;
}
}
}
for(int i=2;i<=n;i++)//求前缀和(即求sum[1]至sum[n]的和)
{
sum[i]+=sum[i-1];
}
}
int T;
int n;
int ka;
int main()
{
aa(40000000);//预处理
cin>>T;
while(T--)
{
cin>>n;//输入
printf("Case %d: %d\n",++ka,sum[n]);//直接输出就行啦
}
return 0;
}
结束啦~