cf1342 C. Yet Another Counting Problem

题目链接
在这里插入图片描述

题意

给定两个数a、b,有q次查询,每次给出l、r,问在l、r之间有多少个数满足x%a%b!=x%b%a

题解

不考虑l、r,满足 k*(ab)/gcd(a,b) ≤ x < k(a*b)/gcd(a,b) + max(a,b)的就是使上式相等的数,根据这个式子容易知道具有周期性,构造前缀和,用‘/’‘%’来构造答案就好(这个题在做的时候真的是蠢到家,打表都打出周期性来了却直接忽略了这一点现场瞎搞)

#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#define _for(i, a, b) for(int i = a; i < b; ++i)
#define _rep(i, a, b) for(int i = a; i <= b; ++i)
#define _dim(i, a, b) for(int i = a; i >= b; --i)
#define closeIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug cout << "******************" << endl
#define FREE freopen("in.txt", "r", stdin)
#define FREO freopen("out.txt", "w", stdout)
#define ls l, m, rt << 1
#define rs m + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef long double LD;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const LD PI = acos(-1);
const LD eps = 1e-10;
int f[MAXN];
LL solve(LL p, int n) {
	return f[n - 1] * (p / n) + f[p%n];
}
int main() {
	int T; cin >> T;
	while (T--) {
		int a, b, q;
		cin >> a >> b >> q;
		int n = a*b;
		_rep(i, 1, n) {
			f[i] = f[i - 1];
			if (i%a%b != i%b%a) ++f[i];
		}
		LL l, r;
		_rep(cs, 1, q) {
			cin >> l >> r;
			cout << solve(r, n) - solve(l - 1, n) << " \n"[q == cs];
		}
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值