正题
有趣的数有趣的你
这一题一点也不有趣,跟我们班的可爱的同学们解释了半天,我们来理解理解。
我们来找一下规律,当n是几位的时候,它带来的贡献(在k前面的数)是多少。
没错,很容易发现绿色的部分是当n的位数小于k的位数时,带来的贡献是,k的前n位-10的n-1次方加一。
否则就直接是(k-10^(k-1))*(10^(n-k)),那么我们就可以算出来n是几位数,按理推出n是多少即可(因为在相同位,在k前面的一定是连续的。)
#include<cstdio> #include<cstdlib> #include<cstring> long long k,m; char s[20]; int got(int x) { int tot=0; while(x>0) { x/=10; tot++; } return tot; } int main() { scanf("%s %lld",s,&m); sscanf(s,"%d",&k); if(k==m && strlen(s)==1) { printf("1"); return 0; } int now=1; long long tot=0; long long begin=1,end=s[0]-'0'; m--;long long mm=m; while(now<20) { long long nowb=begin,nowe=end; if(now>=strlen(s)) nowe--; long long t=nowe-nowb+1; tot+=t; //printf("%lld %lld %lld %lld\n",nowb,nowe,t,mm); if(tot>=m) { printf("%lld\n",nowb-1+mm); return 0; } begin*=10; if(now>=strlen(s)) end*=10; else end=end*10+s[now]-'0'; mm-=t; now++; } printf("0"); }