题目链接 https://ac.nowcoder.com/acm/contest/893/C
很简单的一道题,但是有点坑。
-
求 L—R 之间符合条件的,首先要找到第一个,如果第一个没有,当然输出 0。
-
然后就是求和公式(需要加多少个192)+有多少个res作为底(res就是第一个符合条件的数)
-
最终加上原本的res就OK。
Hint:对于区间符合条件的个数,因为是1+192····这种形式,所以让端点处的值同时减一然后除192然后得到的两个数值相减就是区间的个数(当然这里没考虑第一个,所以上面所述最后要加上第一个数值)
!(在计算个数时,左边的端点要使用res,不然会造成不必要的错误)
因为这个wa了好多发。
下面是C++ AC代码
#include <iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int L,R;
cin>>L>>R;
long long a,b;
long long res=0;
for (int i=L;i<=R;i++){
if ((i%192)*(i%192)*(i%192)%192==1){
res=i;
break;
}
}
a=(res-1)/192;
b=(R-1)/192;
long long result=0;
result=result+(b-a)*(b-a+1)/2*192;
result=result+res*(b-a);
cout<<result+res<<endl;
}
}