现在的位置: 首页 > 综合 > 正文

ural 1233

2013年08月24日 ⁄ 综合 ⁄ 共 728字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.