UVA12716 GCD等于XOR GCD XOR 数论

link
题意:
给定n求
∑ i = 1 n ∑ j = i n [ i ⊕ j = = gcd ⁡ ( i , j ) ]       n < = 3 e 7 \sum_{i=1}^n \sum_{j=i}^{n} {[i\oplus j==\gcd(i,j)]} ~~~~~n<=3e7 i=1nj=in[ij==gcd(i,j)]     n<=3e7
思路:
有个结论,就是 i ⊕ j > = i − j > = g c d ( i , j ) i \oplus j >= i-j>=gcd(i,j) ij>=ij>=gcd(i,j) ,前面很明显,因为 i ⊕ j > = i − j     a n d       i ⊕ j < = i + j i\oplus j>=i-j ~~~and~~~~~i\oplus j<=i+j ij>=ij   and     ij<=i+j 这是二进制异或的性质,后面因为
i 和 j 都 能 写 成 g c d ( i , j ) ∗ k 的 形 式 , 那 么 一 定 大 宇 等 于 g c d . 所 以 i ⊕ j = = gcd ⁡ ( i , j ) 就 能 变 成 i ⊕ j = = i − j 同 时 i = j + gcd ⁡ ( i , j ) 这 样 我 们 可 以 枚 举 i 和 i 的 因 子 做 为 g c d ( i , j ) 然 后 判 断 一 下 就 可 以 了 复 杂 度 O ( n l o g n )    n 需 要 预 处 理 然 后 有 个 问 题 我 疑 惑 的 是 枚 举 i 的 因 子 的 时 候 如 果 满 足 的 话 , 这 个 因 子 k 一 定 是 gcd ⁡ ( i , j ) 嘛 ? 好 像 是 的 , 因 为 假 设 k 是 i 的 因 子 , 同 时 i − j = = i ⊕ j = = k 由 于 i % k = = 0 所 以 j % k = = 0 所 以 k < = g c d ( i , j ) , 由 于 i − j > = gcd ⁡ ( i , j ) 所 以 k 只 能 是 gcd ⁡ ( i , j ) i和j都能写成gcd(i,j)*k的形式,那么一定大宇等于gcd.\\所以i \oplus j==\gcd(i,j)就能变成i\oplus j ==i-j \\同时i=j+\gcd(i,j)这样我们可以枚举i和i的因子做为gcd(i,j) \\然后判断一下就可以了\\ 复杂度O(nlogn)~~n需要预处理 \\然后有个问题我疑惑的是枚举i的因子的时候如果满足的话,\\这个因子k一定是\gcd(i,j)嘛?\\好像是的,因为假设k是i的因子,同时i-j==i\oplus j==k\\由于i\%k==0 所以j\%k==0 所以k<=gcd(i,j) ,\\由于i-j>=\gcd(i,j)所以k只能是\gcd(i,j) ijgcd(i,j)kgcd.ij==gcd(i,j)ij==iji=j+gcd(i,j)iigcd(i,j)O(nlogn)  nikgcd(i,j)kiij==ij==ki%k==0j%k==0k<=gcd(i,j)ij>=gcd(i,j)kgcd(i,j)
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e7+10;
ll ans[N];
void prework(){
	for(int i=1;i<N;i++){
		for(int j=2*i;j<N;j+=i){
				int k=j-i;
				if(i==(k^j))	ans[j]++;
		}
	}
	for(int i=1;i<N;i++)
		ans[i]+=ans[i-1];
}
int main(){
	prework();
	int t;
	scanf("%d",&t);
	int cas=0;
	while(t--){
		++cas;
		int x;
		scanf("%d",&x);
		printf("Case %d: %lld\n",cas,ans[x]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值