卧薪尝胆,厚积薄发。
      
    
            提高B组模拟 C
        
        
        Description:
求
$[1,n]$
中有多少个无序实数对
$(a,b)$
满足
$gcd(a,b)=a\ xor\ b$
.
$1\le n \le 10^7$
Solution:
有性质
$gcd(a,b)\le a-b \le a\ xor\ b$
。左边不等号显然对,右边每位
$2$
进制似乎也是满足条件的。
那么我们可以枚举
$gcd(a,b)=k$
和
$a$
,则
$b=a+k$
,只要判断这样是否满足条件就可以了。
复杂度
$\begin{align}O(\sum_{i=1}^n \frac n i)=O(n\ln n)\end{align}$
。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n;
int main()
{
	scanf("%d",&n);
	long long ans = 0;
	for(int i = 1;i * 2 <= n;++i)
	{
		for(int p = 1;(p + 1) * i <= n;++p)
		{
			int a = i * p,b = i * (p + 1);
			if((a ^ b) == i)++ans;
		}
	}
	cout << ans << endl;
	return 0;
}
          In tag:
其他-其他 
          
        
        Copyright © 2020
        
          wjh15101051
        
      
      ღゝ◡╹)ノ♡
    
          Date: Wed Aug 15 15:15:40 CST 2018
          
          In Category:
          
        
            Timeline
          
            About
          
            Toolbox
          
              Friends