给出
l
,
r
l,r
l,r,计算
∑
i
=
l
r
[
g
c
d
(
(
i
x
)
x
o
r
x
,
x
)
=
1
]
\sum_{i=l}^{r}[gcd((ix)\ xor\ x,x)=1]
i=l∑r[gcd((ix) xor x,x)=1]
今天学了莫比乌斯反演来补这题,发现化的形式更难了,这么多人过的铜牌题,大家都是打表,直接打表 g c d ( ( i x ) x o r x , x ) gcd((ix)\ xor\ x,x) gcd((ix) xor x,x),存在一个长度 2 ⌈ l o g 2 x ⌉ 2^{\lceil log_{2}x \rceil} 2⌈log2x⌉的循环节,就可以直接计算了
比赛的时候发现有循环节了,不过打的是 ( i x ) x o r x (ix)\ xor\ x (ix) xor x的表。。还是差分数组的循环节
#include
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;
}