码迷,mamicode.com
首页 > 其他好文 > 详细

3679. 进制转换

时间:2020-07-18 22:43:02      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:乘法   col   closed   要求   ide   get   none   kkk   sum   

链接: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

 

3679. 进制转换

标签:乘法   col   closed   要求   ide   get   none   kkk   sum   

原文地址:https://www.cnblogs.com/For-Miku/p/13336740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!