本文主要是介绍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);elseputs("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);elseprintf("%I64u", b[k-2]*n);}elseprintf("%I64u", m-fn(n, k-1) + b[k-1]*b[d]-1);}return 0;
}
这篇关于ural 1233的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!