题意:给出一个整数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. http轮询,长轮询

    轮询,长轮询 轮询 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小 ...

  2. SpringCloud与微服务系列专栏

    一. 前置知识 学习SpringCloud之前需要具备和掌握如下框架和工具的使用:SpringMVC,Spring,Spring Boot,Mybatis,Maven,Git. SpringCloud ...

  3. python接口自动化测试 - 数据驱动DDT模块的简单使用

    DDT简单介绍 名称:Data-Driven Tests,数据驱动测试 作用:由外部数据集合来驱动测试用例的执行 核心的思想:数据和测试代码分离 应用场景:一组外部数据来执行相同的操作 优点:当测试数 ...

  4. vue 新建脚手架项目npm命令

    使用国外原镜像 npm install -g @vue/cli   //yarn global add @vue/cli            使用淘宝镜像 cnpm install -g @vue/ ...

  5. 【转载】计算机程序的思维逻辑 (8) - char的真正含义

    看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...

  6. Python 语言规范(Google)

    Python语言规范 Lint tip 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dy ...

  7. Codeforces_845

    A.排序,比较中间两个大小. #include<bits/stdc++.h> using namespace std; ]; int main() { ios::sync_with_std ...

  8. Codeforces_334_C

    http://codeforces.com/problemset/problem/334/C 求不能凑整n,和最小,数量最多的数量. #include<iostream> #include ...

  9. It is possible and safe to monitor a table DML history on sqlserver

    He is my test step: In a test enviroument, I make a table "test"/ demo table:create table ...

  10. Java 代码实现链表

    Linked List 用多少就申请多少内存. 链表是一种链式存储的线性表,所有元素的内存地址不一定连续的. 接口设计 代码实现 MyList.java(接口) package com.cyb; pu ...