可以转化为[1,r] - [1,l-1]。
那么[1,r]与n互质的个数,容斥一下。
用总的减去[1,r]与n不互质的个数,那么不互质的个数怎么求,就是在r区间有与n相同的因子。
然后可以把素因子求出来,然后二进制枚举所有组合情况,
对于当前组合的因子p,找[1,r]有p因子的个数,就是[r/p],然后这样可能有重复(2*3 = 6)
vector<int>sp;
int init(int r,ll n){
for(int i = 2;1ll*i*i <= n;i++){
if(n%i==0){
sp.push_back(i);
while(n%i==0)n /= i;
}
}
if(n!=1)sp.push_back(n);
int len = sp.size();
int ans = 0;
for(int i = 1;i < (1<<len);i++){
int num = 0;
ll k = 1;
for(int j = 0;j < len;j++){
if(i>>j&1){
num++;
k *= sp[j];
}
}
if(num&1)ans += r / k;
else ans -= r / k;
}
return r - ans;
}