• 3679. 进制转换


    链接:Miku

    -------------------------------------

    看起来蛮简单的,就是一道模拟

    求出1-l到1-r,减一下

    数据范围?longlong走起

    kkkk

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int k,m;
    long long l,r;
    long long sum[100000];
    long long c,d;
    long long s;
    long long le=1;
    long long ans;
    long long a1,a2;
    int n;
    int main(){
        cin>>n;
        for(int j=1;j<=n;++j){
        scanf("%lld%lld%d%d",&l,&r,&k,&m);
        le=1;
        ans=0;
        for(int i=1;i<=m;++i){
            le*=k;
        }
        {
            long long a=l/le;
            long long b=a%k;
            a1=(a-b)/k*(k-1)+b;
        }
        {
            long long aa=r/le;
            long long bb=aa%k;
            a2=(aa-bb)/k*(k-1)+bb;
        }
        cout<<a2-a1<<endl;;
        }
        return 0;
    }
    wa

    ????????

    -------------------------------------

    一看输出,竟然有负数!!

    原来这个题根本没保证l<r

    好吧,特判

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int k,m;
    long long l,r;
    long long sum[100000];
    long long c,d;
    long long s;
    long long le=1;
    long long ans;
    long long a1,a2;
    int n;
    int main(){
        cin>>n;
        for(int j=1;j<=n;++j){
        scanf("%lld%lld%d%d",&l,&r,&k,&m);
        le=1;
        ans=0;
        for(int i=1;i<=m;++i){
            le*=k;
        }
        {
            long long a=l/le;
            long long b=a%k;
            a1=(a-b)/k*(k-1)+b;
        }
        {
            long long aa=r/le;
            long long bb=aa%k;
            a2=(aa-bb)/k*(k-1)+bb;
        }
        if(a2<a1)
        cout<<0<<endl;
        else
        cout<<a2-a1<<endl;
        }
        return 0;
    }
    梅开二度

    Wrong Answer

    What?一看,输出比样例少了1

    啥子情况呢?可能是l自己就符合要求,但是我这么写,会把l自己减去

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int k,m;
    long long l,r;
    long long sum[100000];
    long long c,d;
    long long s;
    long long le=1;
    long long ans;
    long long a1,a2;
    int n;
    int main(){
        cin>>n;
        for(int j=1;j<=n;++j){
        scanf("%lld%lld%d%d",&l,&r,&k,&m);
        le=1;
        l--;
        ans=0;
        for(int i=1;i<=m;++i){
            le*=k;
        }
        {
            
            long long a=l/le;
            long long b=a%k;
            a1=(a-b)/k*(k-1)+b;
        }
        {
            long long aa=r/le;
            long long bb=aa%k;
            a2=(aa-bb)/k*(k-1)+bb;
        }
        if(a2<a1)
        cout<<0<<endl;
        else
        cout<<a2-a1<<endl;
        }
        return 0;
    }
    梅开三度

    RE!!!!

    这是因为求le的时候用了大量的乘法,溢出了

    然而事实上,le唯一的用处就是做除数,那么可以把乘法变除法

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int k,m;
    long long l,r;
    long long sum[100000];
    long long c,d;
    long long s;
    long long le=1;
    long long ans;
    long long a1,a2;
    int n;
    int main(){
        cin>>n;
        for(int j=1;j<=n;++j){
        scanf("%lld%lld%d%d",&l,&r,&k,&m);
        le=1;
        l--;
        ans=0;
        for(int i=1;i<=m;++i)
        {
            l/=k;
            r/=k;
        }
    //    for(int i=1;i<=m;++i){
    //        le*=k;
    //    }
        {
            long long a=l;
            long long b=a%k;
            a1=(a-b)/k*(k-1)+b;
        }
        {
            long long aa=r;
            long long bb=aa%k;
            a2=(aa-bb)/k*(k-1)+bb;
        }
        if(a2<a1)
        cout<<0<<endl;
        else
        cout<<a2-a1<<endl;
        }
        return 0;
    }
    Ac
  • 相关阅读:
    su和sudo命令详解
    JS线程Web worker
    Navicat 批处理 自动备份数据库
    MySql【Error笔记】
    vue入门
    动态库
    环境变量
    cmake_learn
    自动编译
    网络编程
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13336740.html
Copyright © 2020-2023  润新知