【搜索】【poj 1426】Find The Multiple

问题

给定你一个数n,让你找出一个能被n整除的由0和1组成的十进制数。

存在多解输出任一个

分析

一看到题就感觉是数论,但是不存在这样的定理。

所以想到了搜索,为了尽可能早的搜到,采取宽度优先搜索。那么如何表示状态和判重呢。如果两个数对n的余数相等,我们可以认为这是一个状态,根据同余定理:

  (a*10) mod n=((a mod n)*10 )mod n

  (a*10+1)mod n=((a mod n)*10+1)mod n

所以每次只需对余数计算即可,从首位开始搜索,共需搜索n个状态,直到余数等于零。

code

program liukee;
type pig=record
     num:int64;
	 ys:longint;
end;

var
  n,x:longint;
  q:array[1..500] of pig;
  hash:array[0..500] of boolean;
  l,r,i,xx:longint;
begin
  readln(x);
  while x<>0 do
  begin
    fillchar(hash,sizeof(hash),0);
	l:=0;
	r:=1;
	q[1].num:=1;
	q[1].ys:=1 mod x;
	hash[q[1].ys]:=true;
	while l<r do
	begin
	  inc(l);
	  xx:=(q[l].ys*10) mod x;
	  if xx=0 then
      begin	
	    writeln(q[l].num*10);
		break;
	  end;
	  if not hash[xx] then
	  begin
	    inc(r);
		q[r].num:=q[l].num*10;
		q[r].ys:=xx;
		hash[xx]:=true;
	  end;
	  xx:=(q[l].ys*10+1) mod x;
	  if xx=0 then
      begin	
	    writeln(q[l].num*10+1);
		break;
	  end;
	  if not hash[xx] then
	  begin
	    inc(r);
		q[r].num:=q[l].num*10+1;
		q[r].ys:=xx;
		hash[xx]:=true;
	  end;
	end;
           readln(x);
  end;
end.

反思

对搜索到的每个状态的存储很关键。如何盘重,及如何由当前状态推知下一状态。

posted @ 2011-04-19 12:07  liukee  阅读(257)  评论(0编辑  收藏  举报