Cod sursa(job #115303)

Utilizator mastermageSchneider Stefan mastermage Data 16 decembrie 2007 12:06:46
Problema Multiplu Scor 30
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasa a 10-a Marime 0.91 kb
#include <stdio.h>

#define maxN 2000100

int a,b,n;
int vec[maxN],lst[maxN],ac[maxN],st,cur,k,kac;

int gcd(int a,int b){int c;do{if(a<b)c=a,a=b,b=c;a%=b;}while(a);return b;}
void inputFunc(){FILE*fi=fopen("multiplu.in","r");fscanf(fi,"%d %d",&a,&b);n=a*b/gcd(a,b);fclose(fi);}

void outputFunc(){
	FILE*fi=fopen("multiplu.out","w");
	int x=0,ul=vec[x];
	while(x!=-1){
		for(int i=ul;ul>vec[x];ul--)fprintf(fi,"0");
		fprintf(fi,"1");ul--;
		x=lst[x];
	}
	while(ul--)fprintf(fi,"0");
	fclose(fi);
}



int main(){
	inputFunc();
	
	int cx=1%n;
	vec[cx]=1,lst[cx]=-1,ac[kac++]=cx;
	k=2;
	cur=st=10%n;
	
	
	
	for(;!vec[0];cur=(cur*st)%n,k++){
		for(int j=kac-1;j>=0;j--){
			int i=ac[j];
			if(vec[i] && vec[i]<k){
				int u=i+cur;if(u>=n)u-=n;
				if(!vec[u])vec[u]=k,lst[u]=i,ac[kac++]=u;
			}
			if(!vec[cur])vec[cur]=k,lst[cur]=-1,ac[kac++]=cur;
		}
	}
	
	outputFunc();
	return 0;
}