题意:
给出l,rl,rl,r,计算
∑i=lr[gcd((ix) xor x,x)=1]
\sum_{i=l}^{r}[gcd((ix)\ xor\ x,x)=1]
i=l∑r[gcd((ix) xor x,x)=1]
Solution:
今天学了莫比乌斯反演来补这题,发现化的形式更难了,这么多人过的铜牌题,大家都是打表,直接打表gcd((ix) xor x,x)gcd((ix)\ xor\ x,x)gcd((ix) xor x,x),存在一个长度2⌈log2x⌉2^{\lceil log_{2}x \rceil}2⌈log2x⌉的循环节,就可以直接计算了
比赛的时候发现有循环节了,不过打的是(ix) xor x(ix)\ xor\ x(ix) xor x的表。。还是差分数组的循环节
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
ll x,n,len,sum[10000005];
ll solve(ll limit)
{
ll ret=limit/len*sum[len],left=limit%len;
return ret+sum[left];
}
int main()
{
cin>>x>>n;
for(int i=30;i>=0;i--)
{
if((1<<i)&x)
{
len=1ll<<(i+1);
break;
}
}
for(int i=1;i<=len;i++) sum[i]=sum[i-1]+(__gcd(i*x^x,x)==1);
while(n--)
{
ll l,r; scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
}
return 0;
}
博客介绍了如何运用莫比乌斯反演和循环节的概念来解决一道关于位运算的数学问题。作者在比赛中发现可以通过计算gcd((ix)^xor^x,x)的循环节来简化计算,从而高效求解。代码中展示了利用循环节和差分数组的方法来快速求解问题。
1129

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



