题意:
询问l 到 r 中有多少个数满足 (x(moda)modb)≠(x(modb)moda) 。
思路:
首先容易想到以a*b长度为一个区间进行划分,因为他们的答案是一样的。但是我们只进行这样的预处理再直接再区间里找是会超时。所以我们改进了一下,预处理之后直接O(1)的来找而不是线性的搜索。
代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
long long int s[N];
vector<long long int> p;
long long int a , b , q;
long long int solve(long long int x)
{
return x/(a*b)*p[a*b]+p[x%(a*b)];
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> a >> b >> q;
p.resize(a*b+1,0);
for(int i = 0 ; i < a*b ; i++)
{
p[i+1] = p[i]+(i%a%b!=i%b%a);
}
while(q--)
{
long long int l , r;
cin >> l >> r;
cout << solve(r+1)-solve(l) << ' ';
}
cout << endl;
}
return 0;
}