1. 程式人生 > 實用技巧 >3679. 進位制轉換

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