zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU 2822 Dogs【两次bfs】
    HDU 2819 Swap【二分图|启发题】
    HDU 2818 Building Block【并查集+根节点偏移量】
    HDU 2817 A sequence of numbers【水题|快速幂】
    Linux内核分析--操作系统是如何工作的
    讲座感想
    用eclipse开发和调试postgresql-8.4.1
    Ubuntu 14.04下翻译软件的安装与比较
    Linux下autoconf和automake使用
    github 使用网址
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13336740.html
Copyright © 2011-2022 走看看