Cod sursa(job #1464010)

Utilizator cojocarugabiReality cojocarugabi Data 22 iulie 2015 02:13:24
Problema Numere 2 Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
# include <bits/stdc++.h>
using namespace std;
ifstream fi("numere2.in");
ofstream fo("numere2.out");
typedef int big[205];
char c[105];
big a,p,u;
void atrib(big a,big b)
{
    for (int i = 0;i < 205;++i) a[i] = b[i];
}
void mul(big a,big b)
{
    big c;
    for (int i = 0;i < 205;++i) c[i] = 0;
    for (int i = 1;i <= a[0];++i)
        for (int j = 1;j <= b[0];++j)
        {
            c[i+j-1] += a[i] * b[j];
        }
    c[0] = a[0] + b[0] - 1;
    int t = 0,i;
    for (i = 1;i <= c[0] || t;++i)
    {
        t += c[i];
        c[i] = t % 10;
        t /= 10;
    }
    c[0] = i - 1;
    for (int i = 0;i <= c[0];++i) a[i] = c[i];
}
void add(big a,big b)
{
    int i,t = 0;
    for (i = 1;i <= max(a[0],b[0]) || t;++i)
    {
        t += a[i] + b[i];
        a[i] = t % 10;
        t /= 10;
    }
    a[0] = i - 1;
}
void div2(big a)
{
    int t = 0;
    for (int i = a[0];i;--i)
    {
        t = t * 10 + a[i];
        a[i] = t / 2;
        t &= 1;
    }
    while (a[0] > 0 && !a[a[0]]) --a[0];
}
int cmp(big a,big b)
{
    if (b[0] > a[0]) return 1;
    if (b[0] < a[0]) return 2;
    for (int i = a[0];i;--i) if (a[i] != b[i]) return b[i] > a[i] ? 1:2;
    return 0;
}
void pls(big a)
{
    ++a[1];
    int cnt = 1;
    while (a[cnt] > 9)
    {
        a[cnt+1] += a[cnt] / 10;
        a[cnt] %= 10;++cnt;
    }
    a[0] = max(a[0],cnt);
}
void mns(big a)
{
    int cnt = 1;
    while (!a[cnt])
    {
        a[cnt] = 9;
        ++cnt;
    }
    --a[cnt];
    if (cnt == a[0] && !a[cnt]) --a[0];
}
void print(big a)
{
    for (int i = a[0];i;--i) cout << a[i];cout << ' ';
}
void atrib(big a,int x)
{
    for (int i = 0;i < 205;++i) a[i] = 0;
    while (x) a[++a[0]] = x % 10,x /= 10;
}
void pow(big d,int x)
{
    if (d[0] * x > 100)
    {
        atrib(u,d);
        mns(u);
        return;
    }
    int g = x;
    big ans,h;
    atrib(h,d);
    atrib(ans,1);
    while (g)
    {
        if (g&1) mul(ans,d);
        mul(d,d);
        g >>= 1;
    }
    int o = cmp(ans,a);
    if (!o)
    {
        for (int i = h[0];i;--i) fo << h[i];fo << '\n';
        fo << x << '\n';exit(0);
    }
    if (o == 1)
    {
        atrib(p,h);
        pls(p);
    }
    else
    {
        atrib(u,h);
        mns(u);
    }
}
int main(void)
{
    fi>>(c+1);
    a[0] = strlen(c+1);
    for (int i = a[0];i;--i) a[a[0] - i + 1] = c[i] - '0';
    for (int i = 335;i;--i)
    {
        atrib(p,1);
        atrib(u,a);
        while (cmp(p,u) <= 1)
        {
            big m;
            atrib(m,p);
            add(m,u);
            div2(m);
            pow(m,i);
        }
    }
    return 0;
}