Cod sursa(job #843156)

Utilizator raulstoinStoin Raul raulstoin Data 27 decembrie 2012 15:15:44
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define nmax 1000010
using namespace std;
short int a[nmax],b[20];
long long d;
void read()
{
	freopen("next.in","r",stdin);
	char x[nmax];
	scanf("%s %lld",&x,&d);
	a[0]=strlen(x);
	for(int i=1;i<=a[0];i++)
		a[i]=(int)(x[i-1]-'0');
	reverse(a+1,a+a[0]+1);
}
long long mod()
{
	int i;
	long long t=0;
	for(i=a[0];i;i--)
		t=(t*10+a[i])%d;
	return t;
}
void transform(long long tmp)
{
	int i;
	for(i=1;tmp;i++)
	{
		b[i]=tmp%10;
		tmp/=10;
	}
	b[0]=i-1;
}
void add()
{
	int i;
	for(i=1;i<=a[0] || i<=b[0];i++)
	{
		a[i]=a[i]+b[i];
		if(a[i]>9)
		{
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
	}
	a[0]=i-1;
	if(a[i])
		a[0]++;
}
void sub()
{
	int i,t=0;
	for(i=1;i<=a[0];i++)
	{
		a[i]-=((i<=b[0])?b[i]:0)+t;
		a[i]+=(t=a[i]<0)*10;
	}
}
void print()
{
	freopen("next.out","w",stdout);
	for(int i=a[0];i;i--)
		printf("%d",a[i]);
	printf("\n");
}
void nr()
{
	long long modulo=mod();
	if(!modulo)
	{
		print();
		return;
	}
	transform(d);
	add();
	transform(modulo);
	sub();
	print();
}
int main()
{
	read();
	nr();
	return 0;
}