Problem - G - Codeforces
题意:
思路:
这种题大概率只能打表
把gcd(kx^x,x)的值打出来,可以发现是个循环节
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e6+10;
const int mxe=1e6+10;
int x,N;
int l,r,t,bk;
int cnt=0;
int a[mxn];
int get(int x){
int res=0;
int b=x/bk;
int c=x%bk;
return a[bk-1]*b+a[c];
}
void solve(){
cin>>x>>N;
t=__lg(x);
while((1ll<<t)<x) t++;
bk=(1ll<<t);
for(int k=1;k<=bk;k++){
if(__gcd((k*x)^x,x)==1ll) a[k]++;
}
for(int i=2;i<bk;i++) a[i]+=a[i-1];
for(int i=1;i<=N;i++){
cin>>l>>r;
cout<<get(r)-get(l-1)<<'\n';
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}