ps.听说这题数据出锅了,于是先去修了个锅(数据里的样例组数和下面的数量对不上,会导致快读超时)

前置知识

引理:一个正整数是3的倍数的充要条件是:该正整数的各数位之和是3的倍数。

证明:

设正整数为 A=x1x2x3...xnA=\overline{x_1x_2x_3...x_n}

A=i=1n10nixii=1nxi (mod 3)A=\sum_{i=1}^n10^{n-i}*x_i \equiv \sum_{i=1}^nx_i\ (mod\ 3)

这个性质应该很多人都熟悉了,所以不多赘述。

关于本题

我们现在要把L到R所有数连在一起,等价于将它们的数字求和,等价于检测把L到R所有数求和后检测其是否被3整除。

因此只需要用等差数列求和公式: sum=(l+r)(rl+1)/2sum=(l+r)*(r-l+1)/2,判断l+rl+rrl+1r-l+1 中是否存在3的因子即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        long long l,r;
        cin>>l>>r;
        if((r+l)%3==0||(r-l+1)%3==0)cout<<"YES\n";
        else cout<<"NO\n";
    }
}
t=int(input())
for i in range(t):
    l,r=map(int,input().split())
    if (l+r)*(r-l+1)%3==0:
        print('YES')
    else:
        print('NO')
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int t=in.nextInt();
        for(int i=0;i<t;i++){
            long l=in.nextLong(),r=in.nextLong();
            if((r+l)%3==0||(r-l+1)%3==0)System.out.println("YES");
            else System.out.println("NO");
        }
            
    }
}
t=gets.to_i
for i in 1..t
    l,r=gets.split().map(&:to_i)
    if (r+l)*(r-l+1)%3==0
        puts 'YES'
    else
        puts 'NO'
    end
end