每日一题:Yet Another Counting Problem

题意

给你两个数 $a$ 和 $b$,$q$ 次询问 $[l,r]$ 内满足 (($x$ mod $a$) mod $b$) != (($x$ mod $b$) mod $a$) 的 $x$ 个数。($q<=500,1<=a,b<=200,1<=l<=r<=1e18$)

solution

若 x % a % b != x % b % a,则(x + a $\times$ b ) % a % b != (x + $a \times b$ ) % b % a. 可以得到规律一定是以 a $\times$ b 为循环的,因此预处理前 a $\times$ b个即可。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
ll t, a, b, q, l, r, sl, sr, sum[N];
int main() {
cin >> t;
while (t--) {
cin >> a >> b >> q;
int p = a * b;
for (int i = 1; i < p; i++) sum[i] = sum[i - 1] + (i % a % b != i % b % a);
while (q--) {
cin >> l >> r;
l--;
sl = l / p * sum[p - 1] + sum[l % p];
sr = r / p * sum[p - 1] + sum[r % p];
cout << sr - sl << ' ';
}
cout << '\n';
}
return 0;
}
作者

Benboby

发布于

2020-04-28

更新于

2021-01-28

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×