URAL - 1233 (计数题目-处理的时候比较麻烦)
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<set> #include<map> #include<list> #include<queue> #include<vector> #define tree int o,int l,int r #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define lo o<<1 #define ro o<<1|1 #define LL unsigned long long #define inf 0x7fffffffffffffff #define eps 1e-7 #define M 9901 #define N 100009 using namespace std; LL T,n,m,k,t,maxv; LL f[20]; void init() { f[0]=1; for(int i=1; i<20; ++i) f[i]=f[i-1]*10ll; } LL ok(LL n,LL k)//k的名次 { LL t=log10(n)+1; LL tk=log10(k)+1; LL ans=0; for(int i=1; i<=t; i++) { if(i<=tk) ans+=k/f[tk-i]-f[i-1]+1;//加了自己! else if(i!=t) ans+=k*f[i-tk]-f[i-1]; else if(k*f[i-tk]<n) ans+=k*f[i-tk]-f[i-1]; else if(k*f[i-tk]>n) ans+=n-f[i-1]+1; else ans+=n-f[i-1]; } return ans; } bool check(LL k,LL m) { LL t=log10(k); if(k/f[t]==1&&k%f[t]==0&&t+1<m)return 1; return 0; } int main() { #ifndef ONLINE_JUDGE freopen("ex.in","r",stdin); #endif init(); while(scanf("%I64d%I64d",&k,&m)==2) { if(ok(k,k)>m||check(k,m)) { puts("0"); continue; } LL l=k,r=inf; while(l<r) { LL mid=(l+r)>>1; if(ok(mid,k)<m) l=mid+1; else r=mid; } printf("%I64d\n",l); } return 0; }