一、内容

 Given an integer N,you should come up with the minimum nonnegative integer M.M meets the follow condition: M 2%10 x=N (x=0,1,2,3....)

Input

The first line has an integer T( T< = 1000), the number of test cases.
For each case, each line contains one integer N(0<= N <=10 9), indicating the given number.

Output

For each case output the answer if it exists, otherwise print “None”.

Sample Input

3
3
21
25

Sample Output

None
11
5

二、思路

  • 证明:N的后n位只与M的后n为有关。
  • 当M只有一位C的时候, M2 = C2, 所以个位只与C有关。
  • 当M有二位时,M = 10 * B +C, M2 = 100B2 + C2 + 10 * 2BC , 那么个位只与C有关,十位与BC有关。
  • 当M有三位时,M = 100 * A + 10 * B + C , M2 = 10000A2 + 10002AB + 100 * (2AC + B2) + 10 2BC + C2 个位只与C有关,十位只与BC有关,百位只与ABC有关。
  • 故根归纳法可证 :N的后n位只与M的后n为有关。
  • 我们只需要从个位开始一位一位的进行搜索即可。每搜索一位,就对n的后缀就行对比,看已经搜索出来的位数是否相同,若相同继续下一位的搜索,直到找到结果。

三、代码

#include <cstdio>
#define min(a, b) (a > b ? b : a)
typedef long long ll;
static int INF = 0x7f7f7f7f;
int t;
ll n, ans;
void dfs(ll m, ll x) {if (x / 10 > n) {//取余的数都大于n直接返回 return;} if (m * m % x == n) {ans = min(m, ans);//找出最小的答案 return;}for (int i = 0; i <= 9; i++) {ll a = i * x + m;ll t = x * 10;if (a * a % t == n % t) { //保证已知后缀相同才往下搜索 dfs(a, x * 10);}   }
}
int main() {scanf("%d", &t);while (t--) {scanf("%lld", &n);if (n % 10 == 2 || n % 10 == 3 || n % 10 == 7 || n % 10 == 8) {printf("None\n"); //没有数的平方个位上是这些数} else {ans = INF;dfs(0, 1);if (ans != INF) {printf("%lld\n", ans);} else {printf("None\n");}}}return 0;
}

Digital Square HDU - 4394 dfs + 剪枝相关推荐

  1. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  2. hdu 4394 Digital Square【标准DFS】

    题目大意 给一个N, 求满足条件的M 样例 Sample Input 3 3 21 25 Sample Output None 11 5 思路: 从低位向高位宽搜索 , 先试探个位, 如果个位合理, ...

  3. hdu 1518 dfs+剪枝

    题目大意: 几根棒子能否组成一个正方形 Sample Input 3           //测试组数 4 1 1 1 1   //棒子数目以及每根棒子的长度 5 10 20 30 40 50 8 1 ...

  4. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  5. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  6. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  7. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  8. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  9. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

最新文章

  1. Python内置函数min(iterable, *[, key, default])
  2. CentOS 7 DIG命令工具打上EDNS补丁
  3. 湖南大学计算机系统原理实验,湖南大学-计算机组成原理实验-实验3-bomblab_图文.pdf...
  4. 客户端登录提示找不到表0
  5. 数独题的生成与解决方法
  6. 【最详细】Tcpdump使用实验
  7. tf-openpose人体姿态估计标签生成--heatmap--vectormap
  8. VBS 实现无限弹窗整人
  9. 教你一分钟制作超炫Flash翻页相册
  10. 锐捷客户端linux登录密码忘记,锐捷S3760忘记密码的恢复方法
  11. Linux下载工具photon,不限速、免配置的 Aria2 免费开源下载软件 Photon,替代迅雷的...
  12. 研究方法|用CiteSpace进行科学文献可视化分析
  13. 产品设计学习(一)——梁宁产品思维大纲
  14. 从MSDN我告诉你下载镜像
  15. 从裸机到嵌入式Linux—总纲
  16. ROS机器人操作系统——订阅者Subscriber的编程实现(五)
  17. 密码学基础(三)密码分析
  18. EXTRACT() 提取函数
  19. 怎么新建从文本文件转换成PDF文件?
  20. 大数据就业前景真的那么好吗

热门文章

  1. 航空航天与国防行业乘客体验—了解如何交付个性化并实现盈利 | 达索系统百世慧®
  2. Lesson 1. 线性回归模型的一般实现形式
  3. matlab实现模糊控制器并仿真,用Matlab实现空调温度模糊控制器的设计与仿真.pdf...
  4. java图片式验证码的实现(引入hutool工具类和自己编写工具类两种方法)
  5. 客户端与服务器端的区别
  6. 指针:const与指针
  7. 基于stm32的BMS电池管理系统源代码-带u基于stm32的BMS电池管理系统源代码-带ucos操作系统
  8. BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)
  9. RN8209C单相电量计量芯片调试记录
  10. python ppt 图片_利用Python将PPT转换为图片并合成长图