Cod sursa(job #419637)

Utilizator darrenRares Buhai darren Data 17 martie 2010 19:15:45
Problema Balanta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<string>

long p,n;
long desc[100],t;
long aval[100];
long s1[100],sz1,mx;
long s2[100],sz2;

void read();
void baz(long x);
void init();
void doit();
long power(long x, long y);
void write();

int main() {
	read();
	baz(n);
	init();
	doit();
	write();
	return 0;
}

void read() {
	freopen("balanta.in","r",stdin);
	scanf("%ld%ld",&p,&n);
}

void baz(long x) {
	if (x==0) return;
	desc[++t]=x%p;
	baz(x/p);
}

void init() {
	int se=(p-1)/2;
	for (int i=0;i<100;++i)
		aval[i]=se;
}

void doit() {
	int i;
	mx=t;
	for (i=1;i<=mx;++i)
		if (desc[i]!=0)
			if (desc[i]>p-desc[i])
				while (desc[i]!=0) {
					++desc[i];
					s1[++sz1]=power(p,i-1);
					int aux=i;
					while (desc[aux]==p) {
						desc[aux]=0;
						++desc[aux+1];
						++aux;
						if (aux>mx)
							mx=aux;
					}
				}
			else
				while (desc[i]!=0) {
					--desc[i];
					s2[++sz2]=power(p,i-1);
				}
}

long power(long x, long y) {
	if (y==0) return 1;
	return x*power(x,y-1);
}

void write() {
	long i;
	freopen("balanta.out","w",stdout);
	printf("%ld\n",mx*(p-1)/2);
	printf("%ld ",n);
	for (i=1;i<=sz1;++i)
		printf("%ld ",s1[i]);
	printf("\n");
	for (i=1;i<=sz2;++i)
		printf("%ld ",s2[i]);
}