牛客网 Math Problem

题目链接 https://ac.nowcoder.com/acm/contest/893/C

很简单的一道题,但是有点坑。

在这里插入图片描述

  1. 求 L—R 之间符合条件的,首先要找到第一个,如果第一个没有,当然输出 0。

  2. 然后就是求和公式(需要加多少个192)+有多少个res作为底(res就是第一个符合条件的数)

  3. 最终加上原本的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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值