poj1426 Find The Multiple

Find The Multiple
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 14622   Accepted: 5938   Special Judge

Description

Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal digits.

Input

The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.

Output

For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.

Sample Input

2

6

19

0

Sample Output

10100100100100100100111111111111111111

就是找倍数,bfs 这题 就是宽搜,我打/*号的是深搜的代码 ,但是很慢,也过不了,很容易就RUNTIME去了!

#include<iostream>

#include<stdio.h>

#include<stack>

#include<string.h>

using namespace std;

stack<int > q;

struct hal{

int x,leave,floor,front;



}l[300000];

int visit[300];

int n,re;

bool init(int num,int flag)

{

	/*

	l[num].x=flag;

	if(flag==0)

	{



		l[num].leave=(l[num>>1].leave*10)%n;

		if(visit[l[num].leave])

			return false;

		visit[l[num].leave]=1;

		l[num].floor=l[num>>1].floor+1;

		if(l[num].leave==0)

		{

			re=num;

			return true;

		}

		if(l[num].floor>200)

			return false;

		

	}

	else if(flag==1)

	{

		l[num].leave=(l[num>>1].leave*10+1)%n;

		if(visit[l[num].leave])

			return false;

		visit[l[num].leave]=1;

		l[num].floor=l[num>>1].floor+1;

		if(l[num].leave==0)

		{

			re=num;

			return true;

		}

		if(l[num].floor>200)

			return false;

		

	}

	else if(flag==-1)

	{

	

		l[num].leave=1;

		l[num].x=-1;

		l[num].floor=1;

	}

	

	

	if(init(num<<1,0))

		return true;

	if(init(num<<1|1,1))

		return true;

	return false;

	*/

	int t,w,j;

	 t=w=1;

	l[t].x=-1;

	l[t].leave=1;

	l[t].floor=1;

	l[t].front=-1;

	while(t<=w)

	{

		for(j=0;j<=1;j++)

		{

			l[++w].floor=l[t].floor+1;

			l[w].front=t;

			l[w].x=j;

			if(j==0)

				l[w].leave=(l[t].leave*10)%n;

			else

				l[w].leave=(l[t].leave*10+1)%n;

			

			if(visit[l[w].leave])

			{

				w--;

				continue;

			

			}

			visit[l[w].leave]=1;

	

			if(l[w].leave==0)

			{

				re=w;

				return true;

			}

			if(l[w].floor>200)

			{

			

				continue;

				

			}

		}

		t++;

	}

	return false;

}

bool bfs(int e)

{

	while(l[e].x!=-1)

	{

		q.push(l[e].x);

		e=l[e].front;

	}

	printf("1");

	while(!q.empty())

	{

		printf("%d",q.top());

		q.pop();

	}

	printf("\n");

	return true;

} 

int main ()

{

	

	while(scanf("%d",&n)!=EOF&&n)

	{

		memset(visit,0,sizeof(visit));

		visit[1]=1;

		l[1].leave=-1;

		init(1,-1);

		//printf("%d",re);

		bfs(re);

	}

	return 0;

}


 

 

 

你可能感兴趣的:(find)