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

解题思路:首先大家应该会想到暴力枚举每一个m,但仔细考虑本题条件应该会涉及处理大数和超时的风险。而使用同余定理就可完全克服这个问题,再仔细分析搜索树就可进一步完全转换存储内容,从根本上解决大数问题。

话不多说,直接上例子,以n=6的bfs搜索过程为例:从最高位开始建立搜索树,逐层搜索每一位

          1

    0         1

  0     1       0     1

0  1  0  1  0  1  0  1

对6求余的结果

         1

    4         5

  4      5      2    3

4  5  2  3  2  3  0  1

即搜索出6的倍数为1110

观察搜索过程,设枚举答案为k(首位一定为1),下一层bfs得到10*k+0,10*k+1

  由同余定理知  (10*k+1)%6 = ((10*k)%6 + 1%6) %6=(((10%6)* (k%6))%6 + 1%6)%6

   如111%6=3,由同余定理知1110%6 =(111*10+0)%6 =(111%6) * (10%6) + 0)%6

***--------------所以我们只需要存下k对n求余的结果,便可层层bfs搜索了。那就只剩怎么得到真实答案了----------------***

此时想到二叉树的知识,对搜索树的节点从1开始编号

          1

    2         3

  4       5         6      7

8  9  10  11  12  13  14  15

我们发现每一个节点 i 的父节点为 i/2(向下取整),节点编号 i 对2求余的结果即与原搜索树内容相同(i的奇偶性决定该层选1/0)

  所以以树形int数组存储k%n,最终从下标 1 到下标 i (mod[i]%n ==0)的搜索路径上每一个下标的奇偶性就得到了最终结果

  例:n=6,mod[14] % 6 ==0,搜索路径下标1-3-7-14,最终结果为1-1-1-0

#define _CRT_SECURE_NO_WARNINGS  //VS编译器宏
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<vector>
#include<queue>
using namespace std; int mod[];//int为4B,给定内存为10000kB,1*10^7B/4B=25*10^5 int main() {
int i, n, len;
//C语言输入速度快,但加“cin.sync_with_stdio(false);”这行后cin的效率就与scanf相当了
while (~scanf("%d", &n), n) { //相当于while(scanf("%d",&n) != EOF , n)
mod[] = % n; //n为1时直接捕捉
for (i = ; mod[i - ]; i++)
mod[i] = (mod[i / ] * + i % ) % n;
i--; //for循环结束条件为mod[i - 1]!=0,真实下标为i-1
len = ;
while (i) { //倒序存储编号
mod[len++] = i % ;
i >>= ;
}
while (len--)printf("%d", mod[len]); //倒序输出正确答案
printf("\n");
}
}

POJ - 1426-Find The Multiple-专为小白解惑-同余加搜索树的更多相关文章

  1. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

  2. POJ 1426 Find The Multiple --- BFS || DFS

    POJ 1426 Find The Multiple 题意:给定一个整数n,求n的一个倍数,要求这个倍数只含0和1 参考博客:点我 解法一:普通的BFS(用G++能过但C++会超时) 从小到大搜索直至 ...

  3. POJ 1426 Find The Multiple(寻找倍数)

    POJ 1426 Find The Multiple(寻找倍数) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 Given ...

  4. POJ.1426 Find The Multiple (BFS)

    POJ.1426 Find The Multiple (BFS) 题意分析 给出一个数字n,求出一个由01组成的十进制数,并且是n的倍数. 思路就是从1开始,枚举下一位,因为下一位只能是0或1,故这个 ...

  5. DFS/BFS(同余模) POJ 1426 Find The Multiple

    题目传送门 /* 题意:找出一个0和1组成的数字能整除n DFS:200的范围内不会爆long long,DFS水过~ */ /************************************ ...

  6. POJ 1426 Find The Multiple (DFS / BFS)

    题目链接:id=1426">Find The Multiple 解析:直接从前往后搜.设当前数为k用long long保存,则下一个数不是k*10就是k*10+1 AC代码: /* D ...

  7. POJ 1426 Find The Multiple(数论——中国同余定理)

    题目链接: http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find ...

  8. POJ 1426 - Find The Multiple - [DP][BFS]

    题目链接:http://poj.org/problem?id=1426 Given a positive integer n, write a program to find out a nonzer ...

  9. poj 1426 Find The Multiple( bfs )

    题目:http://poj.org/problem?id=1426 题意:输入一个数,输出这个数的整数 倍,且只有0和1组成 程序里写错了一个数,结果一直MLE.…… #include <ios ...

随机推荐

  1. HanLP《自然语言处理入门》笔记--2.词典分词

    2. 词典分词 中文分词:指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本. 中文分词算法大致分为基于词典规则与基于机器学习这两大派. 2.1 什么是词 在基于词典的中文分词中,词 ...

  2. kali linux下的部分命令

    查看发行版本 cat    /etc/issue cat   /etc/*-release 查看内核版本 uname  -a 显示机器的处理器架构 arch uname -m 清屏 clear 命令行 ...

  3. IDEA | 识别不出自建webapp文件夹

    背景: 今天自建了一个webapp文件夹,发现idea识别不出来是web应用的资源文件夹 解决方案 打开project structure配置,如下图

  4. Docker(一):理解Docker镜像与容器

    一.镜像的概念 1.广泛镜像概念: 镜像是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在完全相同的副本即为镜像. 2.Docker镜像概念: 在Docker中镜像同样是一种完全 ...

  5. Java 架构知识点整理

    架构学习 1. Java 核心技术 1.1. 基础知识 1.1.1. 进制转换 1.1.2. 异常处理 1.1.3. List 分批代码 1.1.4. 字符串分割 1.1.5. 编码风格 1.2. 并 ...

  6. 八使用Shell函数

    在Shell脚本中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数 使用函数的好处? 使脚本代码更简洁,增强易读性 提高Shell脚本的执行效率 函数定义方法 基本格式1 function ...

  7. (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离

    斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...

  8. java-zhisji

    1. int indexOf(int ch):用来检查给定的一个字符在当前字符串中第一次出现的下标位置.这里的下标和数组的下标意思相近,0表示该字符串的第1个字符,以此类推.当该字符串中并不     ...

  9. python笔记18(复习)

    今日内容 复习 内容详细 1.Python入门 1.1 环境的搭建 mac系统上搭建python环境. 环境变量的作用:方便在命令行(终端)执行可执行程序,将可执行程序所在的目录添加到环境变量,那么以 ...

  10. python strip()方法使用

    描述 python strip() ,用于去除述字符串头尾指定字符(默认为空格或换行符)或字符序列. 注意:此方法只能去除头尾的空格或是换行符,不能去除中间的. 语法: str.strip([char ...