题目传送门
题意:给你一个a,b,q,再给你一个区间l,r然后就求在这个区间中所有满足x%a%b!=x%b%a的所有点。
思路:我是通过打表发现的,对于a,b的最小公倍数比如a,b是7 10,那最小公倍数是70,打表发现70到79这十个数字都是x%a%b==x%b%a,我们可以根据前缀和的思路 求1到i中所有满足的条件,最后结果就是fun(r)-fun(l-1),那么1到i的结果是多少呢??,结果是i-lcm(a,b)*b-min(i%lcm(a,b));
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,q,c;
ll fun(ll x){
ll cnt=x/c;
ll re=x%c+1;
return x-cnt*b-min(re,b);
}
int main(){
int t;
cin>>t;
while(t--){
cin>>a>>b>>q;
if(a>b) swap(a,b);
c=a/__gcd(a,b)*b;
while(q--){
ll l,r;
cin>>l>>r;
printf("%lld\n",fun(r)-fun(l-1));
}
}
return 0;
}