添加鏈接描述
題意:
給你三個數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;
}