Digital Square HDU - 4394 dfs + 剪枝
一、内容
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 + 剪枝相关推荐
- 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 ...
- hdu 4394 Digital Square【标准DFS】
题目大意 给一个N, 求满足条件的M 样例 Sample Input 3 3 21 25 Sample Output None 11 5 思路: 从低位向高位宽搜索 , 先试探个位, 如果个位合理, ...
- hdu 1518 dfs+剪枝
题目大意: 几根棒子能否组成一个正方形 Sample Input 3 //测试组数 4 1 1 1 1 //棒子数目以及每根棒子的长度 5 10 20 30 40 50 8 1 ...
- 【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 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- poj2248 DFS+剪枝 or BFS
传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...
最新文章
- Python内置函数min(iterable, *[, key, default])
- CentOS 7 DIG命令工具打上EDNS补丁
- 湖南大学计算机系统原理实验,湖南大学-计算机组成原理实验-实验3-bomblab_图文.pdf...
- 客户端登录提示找不到表0
- 数独题的生成与解决方法
- 【最详细】Tcpdump使用实验
- tf-openpose人体姿态估计标签生成--heatmap--vectormap
- VBS 实现无限弹窗整人
- 教你一分钟制作超炫Flash翻页相册
- 锐捷客户端linux登录密码忘记,锐捷S3760忘记密码的恢复方法
- Linux下载工具photon,不限速、免配置的 Aria2 免费开源下载软件 Photon,替代迅雷的...
- 研究方法|用CiteSpace进行科学文献可视化分析
- 产品设计学习(一)——梁宁产品思维大纲
- 从MSDN我告诉你下载镜像
- 从裸机到嵌入式Linux—总纲
- ROS机器人操作系统——订阅者Subscriber的编程实现(五)
- 密码学基础(三)密码分析
- EXTRACT() 提取函数
- 怎么新建从文本文件转换成PDF文件?
- 大数据就业前景真的那么好吗
热门文章
- 航空航天与国防行业乘客体验—了解如何交付个性化并实现盈利 | 达索系统百世慧®
- Lesson 1. 线性回归模型的一般实现形式
- matlab实现模糊控制器并仿真,用Matlab实现空调温度模糊控制器的设计与仿真.pdf...
- java图片式验证码的实现(引入hutool工具类和自己编写工具类两种方法)
- 客户端与服务器端的区别
- 指针:const与指针
- 基于stm32的BMS电池管理系统源代码-带u基于stm32的BMS电池管理系统源代码-带ucos操作系统
- BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)
- RN8209C单相电量计量芯片调试记录
- python ppt 图片_利用Python将PPT转换为图片并合成长图