题意:给定 TT 组询问,每组询问给出两个正整数 L,RL,R,求 x=L(L+1)(L+2)Rx=\overline{L(L+1)(L+2)\cdots R} 是否是 33 的倍数。

首先是一个广为人知的结论:判断一个数 xx 是否是 33 的倍数,只需要将它所有数位相加判断是否是 33 的倍数即可。

根据这个结论,本题转化为求 L+(L+1)+(L+2)++RL+(L+1)+(L+2)+\cdots+R 的和是否是 33 的倍数。

考虑 L+(L+1)+(L+2)++R=(L+R)(RL+1)2L+(L+1)+(L+2)+\cdots+R=\dfrac{(L+R)(R-L+1)}{2},另外下面的分母不影响整个和是否是 33 的倍数。

因此分别判断 (L+R)(L+R)(RL+1)(R-L+1) 是否是 33 的倍数即可。

#include<cstdio>
#define int long long
int init(){
	char c = getchar();
	int x = 0, f = 1;
	for (; c < '0' || c > '9'; c = getchar())
		if (c == '-') f = -1;
	for (; c >= '0' && c <= '9'; c = getchar())
		x = (x << 1) + (x << 3) + (c ^ 48);
	return x * f;
}
void print(int x){
	if (x < 0) x = -x, putchar('-');
	if (x > 9) print(x / 10);
	putchar(x % 10 + '0');
}
signed main(){
	int T = init();
	for (int i = 1; i <= T; ++i) {
		int L = init(), R = init();
		int s1 = L + R;
        int s2 = R - L + 1;
		if (s1 % 3 == 0 || s2 % 3 == 0)
			puts("YES");
		else
			puts("NO");
	}
}

后话:本来考虑的是利用逆元求解,但是后来由于一些原因得知了这个做法。还是不错的一道题。

upd:由于不熟悉评奖规则,在题解区发了第一篇题解之后没去那个讨论帖子下面抢,结果没了。另外那个快读被卡的就是我了。