ural 1233
可以推出规律 每一个数第一次出现的位置 和 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;
}

浙公网安备 33010602011771号