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("
");
	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;
}


 

 

原文地址:https://www.cnblogs.com/snake-hand/p/3167745.html