【洛谷P2022】有趣的数
有趣的数
首先求出1~k中有多少个在k前面的数的个数,若>m,则无解
比如12345,从第一位开始,
1 0~1 共2个 1-0+1
12 10~12共3个 12-10+1
123 100~123 共24个 123-100+1
1234 1000~1234 共235个 1234-1000+1
...
之后看还需要在k前面加多少个数,向下枚举
与上面相似
123450 100000~123450
1234500 1000000~1234500
直到前面的数字>=k,停止枚举,
处理出答案
...
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define int long long int P[20]={1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19}; int k,m,ans; #undef int int main() #define int long long { scanf("%lld%lld",&k,&m); int l=log10(k),div=1,sum=0; int ll=l; for(int i=1;i<=10;i++) if(k==P[i]&&m!=i+1){ puts("0"); return 0; } while(l+1){ sum+=k/div-P[l]+1; div*=10; l--; } if(m<sum){ puts("0"); return 0; } if(m==sum){ printf("%lld\n",k); return 0; } m-=sum; int u=0; while(1){ u++; if(ll+u>18){ puts("0"); return 0; } int d=k*P[u]-P[ll+u]; if(m>d) m-=d; else{ ans=P[ll+u]+m-1; break; } } printf("%lld\n",ans); return 0; }