C. Yet Another Counting Problem
题意: t t t次测试,每次测试给定 a 、 b 、 q a、b、q a、b、q
接下来 q q q次询问,给定 l i , r i l_i,r_i li,ri,问在 [ l i , r i ] [l_i,r_i] [li,ri]区间范围内,使得 ( ( x m o d a ) m o d b ) ≠ ( ( x m o d b ) m o d a ) ((x \bmod a)\bmod b)\ne ((x \bmod b)\bmod a) ((xmoda)modb)=((xmodb)moda)的数字x个数
思路:
找规律( a < b a<b a<b)
每个使得 ( ( x m o d a ) m o d b ) = ( ( x m o d b ) m o d a ) ((x \bmod a)\bmod b)=((x \bmod b)\bmod a) ((xmoda)modb)=((xmodb)moda)成立的范围为 [ 1 , b − 1 ] , [ l c m ( a , b ) , l c m ( a , b ) + b − 1 ] [1,b-1],[lcm(a,b),lcm(a,b)+b-1] [1,b−1],[lcm(a,b),lcm(a,b)+b−1]
把 r i − l i + 1 r_i-l_i+1 ri−li+1个数字减去成立的个数: [ 1 , r i i ] [1,r_ii] [1,rii]中成立的个数 c o co co减去 [ 1 , l i − 1 ] [1,l_i-1] [1,li−1]中成立的个数 p r pr pr。
int n;
/*int main(){///找规律部分
LL l,a=7ll,b=14ll,r,ans;
for(int i=1;i<=200;i++){
if((i%a)%b==(i%b)%a)
cout<<i<<" ";
}
return 0;
}*/
LL ans[maxn];
int main(){
int t,f1=0,f0=0,len,q;
LL l,a,b,r,tt,co,pr,minn,maxx;
t=ird();
while(t--){
a=lrd();b=lrd();q=ird();
tt=llcm(a,b);
if(a>b)swap(a,b);
if(a==b||b%a==0){
for(int i=1;i<=q;i++){
l=lrd();r=lrd();}
for(int i=1;i<=q;i++)
cout<<0<<" ";
cout<<endl;
continue;
}
for(int i=1;i<=q;i++){
l=lrd();r=lrd();
co=r/tt*b;
if(r<r/tt*tt+b-1&&co){
co-=r/tt*tt+b-1-r;}
pr=(l-1)/tt*b;
if((l-1)<(l-1)/tt*tt+b-1&&pr){
pr-=(l-1)/tt*tt+b-1-l+1;}
co-=pr;
ans[i]=r-l+1-co;
minn=min(r,b-1ll);
maxx=max(l,1ll);
if(minn>=maxx)ans[i]-=minn-maxx+1;
}
for(int i=1;i<=q;i++)
cout<<ans[i]<<" ";
cout<<endl;
}
}