1.题目
题目描述
给你两个正整数L, R, 然后把L到R之间的数连起来形成一个新的数x。判断x是不是3的倍数。
例如:L = 2, R = 4, 则 x = 234; L = 10, R =12, x = 101112.
输入描述:
第一行是一个整数T,表示有T组数据。接下来有T行,每行两个整数L, R(L<= R)。
1<=T<= 10, L <= R <= 10^18 。
输出描述:
每组数据对应只有1行输出,如果x是3的倍数,则输出"YES",否则输出"NO"。
示例1
输入
3
2 4
2 2
3 5
输出
YES
NO
YES
2.分析
灵活转换
常识:一个数字为3的倍数,则该数字的每一位上的数字相加的和也为3的倍数
在此,稍作变形,
由于是连续整数相拼接而成的长字符串,实际上可以转换为从l到r的数字之和
举个栗子
l=19
r=23
拼接而成的字符串: 1920212223
数字之和为:1+9+2+0+2+1+2+2+2+3=24 是3的倍数,所以拼接而成的字符串数字为3的倍数
而(19+23)*(23-19+1)/2 =42*5/2=21*5 是3的倍数,同样可以证明
[等差数列求和:(首项+末项)*(项数)/2]
3.代码
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
int t;
cin>>t;
while(t--)
{
LL l,r;
scanf("%lld%lld",&l,&r);
auto t1=l+r; //首项+末项
auto t2=r-l+1; //项数
//所有部分数字之和为3的倍数,则整体字符串数字也为3的倍数
if(t1%3==0 || t2%3==0) puts("YES");
else puts("NO");
}
return 0;
}
4.总结
灵活转变
5.更新日志
2022.7.25
欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~