3679. 進位制轉換
阿新 • • 發佈:2020-07-18
連結: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(){ cinwa>>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; longlong bb=aa%k; a2=(aa-bb)/k*(k-1)+bb; } cout<<a2-a1<<endl;; } return 0; }
????????
-------------------------------------
一看輸出,竟然有負數!!
原來這個題根本沒保證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