Cod sursa(job #38328)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 25 martie 2007 17:41:01
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <cstring>
#define FIN "next.in"
#define FOUT "next.out"
#define nrc 1
#define div 10

class numar {
	public:
		long A[1000000/nrc+1];

		numar() {
			memset(A,0,sizeof(A));
		}
		numar (long long x) {
			long p=1;
               A[0] = 1;
			for (;x;x/=10) {
				A[ A[0] ] += p*(x%10);
				p*=10;
				if ( p==div ) 
					A[0]++, p=1;
			}
		}
		void load() {
			char buf[1000000];
			long n, i, p;

			fgets(buf, 1000000, stdin);
			n = strlen(buf);
			while ( buf[n]>'9' || buf[n]<'0' )
				n--;

			p=1; A[0]=1;
			for (i=n; i>=0; --i) {
				A[ A[0] ] += p*(buf[i]-'0');
				p*=10;
				if ( p==div )
					A[0]++, p=1;
			}
               if ( p==1 )
               	A[0]--;
		}
	
		long long rest(long long x) {
			long long t=0;
			long i;
			for (i=A[0]; i>0; --i)
				t = (t*div+A[i]) % x;
			return t;

		}
		void add(long long x) {
			numar B(x);
			long t, i;
			for (i=1, t=0; i<=A[0] || i<=B.A[0] || t; i++, t/=div)
				A[i] = (t = A[i] += (B.A[i]+t)) % div;
               A[0] = i-1;
		}
		void write() {
			long t,i;
			printf("%ld", A[A[0]]);
			for (i=A[0]-1;i;--i) 
				for (t=div/10; t; t/=10)
					printf("%ld", (A[i]/t)%10);
			printf("\n");
		}
} A;

long long D;

int main() {
	freopen(FIN, "r", stdin);
	A.load();
	scanf("%lld", &D);
	fclose(stdin);

	A.add( D-A.rest(D) );

	freopen(FOUT, "w", stdout);
	A.write();
	fclose(stdout);
	return 0;
}