Cod sursa(job #159360)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 14 martie 2008 08:32:59
Problema Next Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000007
#define D 30
void add(int A[N], int B[D])
{
	int i, t = 0;
	for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
		A[i] = (t += A[i] + B[i]) % 10;
	A[0] = i - 1;
}
void sub(int A[N], int B[D])
{
	int i, t = 0;
	for (i = 1; i <= A[0]; i++)
        A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
    for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
long long mod(int A[N], long long B)
{
    int i;
	long long	t = 0;
    for (i = A[0]; i > 0; i--)
        t = (t * 10 + (long long)A[i]) % B;
    return t;
}
void transform(int A[D],long long x)
{
	do{
		A[++A[0]]=x%10;
		x/=10;
	}while(x);
}
void sir_nr(int A[N],char s[N])
{
	int l=strlen(s);
	A[0]=l;
	for(int i=1;i<=l;++i)
		A[i]=(s[l-i]-'0');
}
void scrie(int A[N])
{
	for(int i=A[0];i>0;--i)
		printf("%d",A[i]);
	printf("\n");
	exit(0);
}
int main(){
	char s[N];
	long long d,r;
	int a[N],x[D];
	freopen("next.in","r",stdin);
	freopen("next.out","w",stdout);
	scanf("%s\n",s);
	scanf("%lld",&d);
	sir_nr(a,s);
	r=mod(a,d);
	if(r==0)
		scrie(a);
	transform(x,d);
	add(a,x);
	transform(x,r);
	sub(a,x);
	scrie(a);
	return 0;
}