Cod sursa(job #992214)

Utilizator sebinechitasebi nechita sebinechita Data 1 septembrie 2013 14:42:51
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <cmath>
using namespace std;

ifstream fin ("next.in");
ofstream fout("next.out");
#define baza 10
#define MAX 1000010
long long int i,s,m,a1,t,j,l,d,k,ci,kl;
char n[MAX];

unsigned int a[MAX],b[20];


void inm(unsigned int* al, unsigned int* bl, unsigned int* ml)
{

    ml[0]=al[0]+bl[0]-1;
    for(i=1;i<=al[0];i++)
    {
        for(j=1;j<=bl[0];j++)
        {
            ml[i-1+j]+=al[i]*bl[j];

        }
    }

    for(i=1;i<=ml[0];i++)
    {

        if(ml[i]>9)
        {
            ml[i+1]+=ml[i]/10;
            ml[i]%=10;
        }
    }
    if(ml[i])
        ml[0]++;




}

void transforma(long long int sos, unsigned int* al)
{
    long long int k=0;

    while(sos)
    {
        al[++k]=sos%baza;
        sos/=baza;
    }


    al[0]=k;

}

void fshow(unsigned int *al)
{
    for(i=al[0];i>=1;i--)
    {
        fout<<al[i];
    }
}

void show(unsigned int *al)
{
    for(i=al[0];i>=1;i--)
    {
        cout<<al[i];
    }
}

long long int mod(unsigned int* al,long long int d)
{
    long long int p=0;
    for(i=al[0];i>=1;i--)
    {


        long long int xi=al[i]+p;
        p=xi%d;
p*=baza;
    }
    p/=baza;
    return p;
}

long long modulo( unsigned int* A,long long int B)
{
    long long i, T = 0;

    for ( i = A[0]; i; --i )
            T = ( T * baza + A[i] ) % B;

    return T;
}


void add(unsigned int* cl, unsigned int* dl)
{

    for(kl=1;kl<=cl[0];kl++)
    {
        cl[kl]+=dl[kl];

    }
    for(kl=1;kl<=cl[0];kl++)
    {
        cl[kl+1]+=(cl[kl]/baza);

        cl[kl]%=baza;

    }

    if(cl[cl[0]+1])
        cl[0]++;


}

int main()
{

    fin>>n;
    a[0]=strlen(n);
    for(i=1;i<=a[0];i++)
    {
        a[i]=n[a[0]-i]-'0';
    }

    fin>>d;
    long long int p=modulo(a,d);

    if(!p)
        fshow(a);
    else
    {
        p=d-p;

        transforma(p,b);
        if(a[0]>b[0])
        {
            add(a,b);
            fshow(a);
        }
        else
        {
            add(b,a);
            fshow(b);
        }


    }

    return 0;
}