添加链接描述
题意:
给你三个数a,b,q,查询q次,每次一个区间,寻找该区间内有多少个x,使得(x%b)%a!=(x%a)%b.
思路:
先求a,b的最小公倍数,每个最小公倍数是一个循环,我们只需要求所查询的区间内有多少个完整的最小公倍数区间,再加上其余不完整的部分就ok。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
#define int long long
int flag[200005];
signed main()
{
int t;
cin>>t;
while(t--)
{
int a,b,q,sum=0,n,x,y;
cin>>a>>b>>q;
for(int i=a;i<=a*b;i++)
{
if(i%a==0&&i%b==0)
{
n=i;
break;
}
}
for(int i=0;i<n;i++)
{
if((i%a)%b!=(i%b)%a)
{
sum++;
}
flag[i]=sum;
}
for(int i=0;i<q;i++)
{
cin>>x>>y;
cout<<(y/n)*sum+flag[y%n]-((x-1)/n)*sum-flag[(x-1)%n]<<" ";
}
cout<<endl;
memset(flag,0,sizeof flag);
}
return 0;
}