可以推出规律 每一个数第一次出现的位置 和 n*10后出现的位置 要特殊考虑 是10的倍数的情况(10,100,1000, .......) 它的位置是不会改变的
#include<cstdio> #define uLL unsigned long long using namespace std; uLL a[30] = {}, b[30] = {1,10}; void init() { for(int i = 1; i <= 20; ++i) a[i] = a[i-1]*10 + 1; for(int i = 2; i <= 20; ++i) b[i] = b[i-1]*10; } uLL fn(uLL n, uLL k) { uLL i = 0; while(n >= 10) { i += (n%10)*a[k++] + 1; n /= 10; } return i+(n-1)*a[k]+1; } int findd(uLL n) { int i = 0; while(n >= 10) { i++; n /= 10; } return i; } int main() { init(); uLL n,m,k; scanf("%I64u%I64u",&n,&m); uLL d = findd(n); if(fn(n, 1) > m) { puts("0"); return 0; } if(fn(n, 1) == (d+1)) { if(fn(n, 1) == m) printf("%I64u", n); else puts("0"); return 0; } else { k = 1; while(fn(n, k) <= m) k++; if(m == fn(n, k-1)) { if(k > 2) printf("%I64u", b[k-2]*n-1); else printf("%I64u", b[k-2]*n); } else printf("%I64u", m-fn(n, k-1) + b[k-1]*b[d]-1); } return 0; }