链接: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; }
????????
-------------------------------------
一看输出,竟然有负数!!
原来这个题根本没保证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; }