poj 1426

大致题意:

给出一个整数n(1 <= n <= 200)。求出任意一个它的倍数m,要求m必须只由十进制的'0''1'组成。

 

解题思路:

首先暴力枚举肯定是不可能的 1000ms 想不超时都难,而且枚举还要解决大数问题。。

要不是人家把这题放到搜索,怎么也想不到用BFS。。。

 

解题方法: BFS+同余模定理

 

不说废话。

 

首先说说朴素的不剪枝搜索方法:

我以n=6为例

首先十进制数,开头第一个数字(最高位)一定不能为0,即最高位必为1

 

6 ”01十进制倍数k,那么必有k%6 = 0

现在就是要用BFSk

1、先搜索k的最高位,最高位必为1,则此时k=1,但1%6 =1  !=  0

因此k=1不是所求,存储余数 1

2、搜索下一位,下一位可能为0,即 k*10+0,此时k=10,那么k%6=4

可能为1,即 k*10+1,此时k=11,那么k%6=5

由于余数均不为0,即k=10k=11均不是所求

3、继续搜索第三位,此时有四种可能了:

对于k=10,下一位可能为0,即 k*10+0,此时k=100,那么k%6=4

              下一位可能为1,即 k*10+1,此时k=101,那么k%6=5

对于k=11,下一位可能为0,即 k*10+0,此时k=110,那么k%6=2

              下一位可能为1,即 k*10+1,此时k=111,那么k%6=3

由于余数均不为0,即k=100k=101k=110k=111均不是所求

4、继续搜索第四位,此时有八种可能了:

对于k=100,下一位可能为0,即 k*10+0,此时k=1000,那么k%6=4

              下一位可能为1,即 k*10+1,此时k=1001,那么k%6=5

对于k=101,下一位可能为0,即 k*10+0,此时k=1010,那么k%6=2

              下一位可能为1,即 k*10+1,此时k=1011,那么k%6=3

对于k=110,下一位可能为0,即 k*10+0,此时k=1100,那么k%6=2

              下一位可能为1,即 k*10+1,此时k=1101,那么k%6=3

对于k=111,下一位可能为0,即 k*10+0,此时k=1110,那么k%6=0

              下一位可能为1,即 k*10+1,此时k=1111,那么k%6=1

我们发现k=1110时,k%6=0,即1110就是所求的倍数

 如果给的n较大,得到的将是一个大数,这个时候int类型将不能满足需要,我们就开一个__int64的数组供我们使用,具体代码如下:

#include <iostream>
using namespace std;
__int64 q[9999999];
int n;

void BFS()
{
	int rear,front;
	rear=front=0;
	q[rear]=1;//初始化最高位
	rear++;
	__int64 top;
	while (rear>front)
	{
		top=q[front];
		if (top%n==0)
		{
			break;
		}
		top*=10;//像一个队列一样双向循环
		q[rear]=top;
		rear++;
		q[rear]=top+1;
		rear++;
		front++;
	}
	printf("%I64d\n",top);
}

int main()
{
	while (cin>>n&&n!=0)
	{
		BFS();
	}
	return 0;
}


 

 

你可能感兴趣的:(poj)