F题 题意寻找l到r区间中的一个数x连续子序列mod3=0的个数(1<=l<r<1e18)观察到数据范围十分的大,正常做法比如前缀和一定是不可做的,那么我们硬要暴力做第一时间想到的肯定是打表,打表后发现当x>=100答案数每次递增1,也就是每个x都满足条件,这样我们很容易得到最终结果,在赛场上我们直接算出前100个对应的数值即可,这样前缀和就可以做了,由于T数量较少更加暴力每次历遍前100个数字也可以。但是赛后我们该思考一下为什么当x>=100时x一定满足条件,在听直播时我听到一个词叫鸽笼效应然后就显然成立了(由于太菜完全联想不到),鸽笼效应的大意是假设有n+1只鸽子n个格子那么一定会有至少两只鸽子在同一个笼子里。这个道理我是懂得的,但是和这题有什么关系呢,经过我努力的思考过后,我发现x>=100的特点是x有三位数字了,由于是mod3根据同余定理我们可以将每一位数都视为0或1或2,选择0,x明显满足条件,选择三个相同的数字x也成立,那么只能选择1和2的搭配,有且只有两种选择两个1一个2或者两个2一个1那么无论如何排列都会有一个1与一个2相邻,也就满足条件(破案了),至于更多的位数只需要其中三个就一定满足条件了
#include<stdio.h> #include<iostream> using namespace std; int main() { int t; long long int l,r; long long int count=0; scanf("%d",&t); while(t--) { cin>>l>>r; count=0; for( long long j=l;j<=r;j++)//小细节开int会超时 { if(j>=100){count+=r-j+1;break;} else { if(j<10&&j%3==0)count++; if((j%10%3==0||j/10%3==0||(j/10%3+j%10%3)%3==0)&&(j>=10))count++; } } cout<<count<<endl; } return 0; }