Codeforces 1342 C. Yet Another Counting Problem(找规律)

在这里插入图片描述

题意:

[ l , r ] [l,r] [l,r] 范围内多少个数满足 ( x % b ) % a ! = ( x % a ) % b (x \% b) \% a != (x \% a) \% b (x%b)%a!=(x%a)%b

一般这种题没什么思路就打表找一下规律。

7
8
9
10
11
12
13
14
15
16
17
18
19
20
28
29
30
31
32
33
34
35
36
37
38
39
40
41
49
50
51
52
53
54
55
56
57
58
59
60
61
62
70
71
72
73
74
75
76
77
78
79
80
81
82
83
91
92
93
94
95
96
97
98
99
100

可以发现当为 l c m ( a , b ) lcm(a,b) lcm(a,b) 倍数的时候,再连续 b b b 个数字,是那个式子满足相等的。说明循环周期是一个 l c m lcm lcm 。这样规律找到就好写了。

AC代码:

const int N = 40010;
ll a, b, q, lc;
ll s[N];
ll ans;
void init()
{
	rep(i, 1, lc)
		s[i] = s[i - 1] + (i % a % b != i % b % a);//预处理
}

ll cal(ll x)
{
	return s[lc] * (x / lc) + s[x % lc];
}

int main()
{
	int t;
	sd(t);
	while (t--)
	{
		slddd(a, b, q);
		lc = lcm(a, b);
		init();
		while (q--)
		{
			int l, r;
			sdd(l, r);
			ans = cal(r) - cal(l - 1);
			printf("%lld ", ans);
		}
		printf("\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值