Cod sursa(job #238514)

Utilizator DraStiKDragos Oprica DraStiK Data 2 ianuarie 2009 14:06:34
Problema Next Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#define DIM 1000005
#define ll long long
int a[DIM],b[DIM];
int n;
ll r,d;
int maxim (int a,int b)
{
    if (a>b)
        return a;
    else
        return b;
}
ll rest (int a[DIM],ll val)
{
    int i;
    ll t=0;
    for (i=1; i<=a[0]; ++i)
    {
        t=t*10+a[i];
        t%=val;
    }
    return t;
}
void clean (int a[DIM])
{
    int i;
    for (i=1; i<=a[0]; ++i)
        a[i]=0;
    a[0]=0;
}
void aduna (int a[DIM],ll val)
{
    int i,max,t=0;
    b[0]=a[0];
    for (i=1; i<=a[0]; ++i)
        b[b[0]-i+1]=a[i];
    clean (a);
    while (val)
    {
        a[++a[0]]=val%10;
        val/=10;
    }
    max=maxim (a[0],b[0]);
    a[0]=max;
    for (i=1; i<=max; ++i)
    {
        a[i]+=b[i]+t;
		t=a[i]/10;
		a[i]%=10;
    }
    if (t)
    a[++a[0]]=1;
}
void print ()
{
    int i;
    for (i=1; i<=a[0]; ++i)
        printf ("%d",a[a[0]-i+1]);
}
int main ()
{
    freopen ("next.in","r",stdin);
    freopen ("next.out","w",stdout);
    int i;
    ll x=0;
    char ch;
	while (scanf ("%c",&ch))
	{
		if(ch=='\n')
        	break;
		a[++n]=ch-'0';
	}
    a[0]=n;
    if (n<17)
    {
        i=1;
        while (i<=n)
        {
            x*=10;
            x+=a[i++];
        }
    }
    scanf ("%lld",&d);
    if (x<d)
    {
        printf ("%lld",d);
        return 0;
    }
    r=rest (a,d);
    aduna (a,d-r);
    print ();
    return 0;
}