Digital Square

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1310 Accepted Submission(s):
501

Problem Description
Given an integer N,you should come up with the minimum
nonnegative integer M.M meets the follow condition:
M2%10x=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 <=109), 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
 
题意很简单 M2%10x=N (x=0,1,2,3....)就不啰嗦了,
思路:
  可以用dfs;(其实就是暴力+剪枝)

eg:n 为 21; 那么,我们从个位数1开始搜, 1 * 1 = 1, 9 * 9 = 81,他们的个位数都是1,那么,1和9可以作为我们找的那个数的个位数。
然后我们就记忆一下这个我们找到的东西,放在ans里面。
下面我们开始搜第二位,设搜的是ab的a(其中,我们的b是已经记忆下来的个位)。
ab * ab % 100 = 21; 那么,我们的 是不是就由(b * b / 10 + a * b * 2) % 10 得到的(看不出来的可以拿纸笔算一下;)。未知数就只有a吧,那么,我们就for一遍去找a,找到a了,我们就以同样的方法去找c(如果有c的话)。这样,就是剪枝了。
最后,如果我们找的n有x位,那么,我们要找的m * m % ? == n 的m最多也只有x位。至此,就结束了。

ps:http://acm.hdu.edu.cn/showproblem.php?pid=4394

详见代码

#include <cstdio>
#include<iostream>
#define INF 0xfffffff
#define ll __int64
using namespace std; ll t,digit[],num,n,ans,r,final; ll min(ll a, ll b)
{
return a > b? b : a;
}
void get(ll t) //得到num = n的位数,digit[]存每个位上分别是什么。
{
num=;
while(t)
{
digit[ ++num] = t % ;
t/=;
}
}
void solve(ll p,ll w,ll ans)
{
if(p>num)
{
final=min(final,ans);
return ;
}
for(ll k = ;k<;k ++)
{
if( (ans*ans/w + r*k%)%==digit[p])//(b * b / 10 + a * b * 2) % 10,,,r=2*ans
solve(p+,w*,k*w+ans);
}
}
int main()
{
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
get(n);
if(digit[]==||digit[]==||digit[]==||digit[]==)
{
puts("None");
continue;
}
final = INF;
for(ll i=;i<;i++)
{
if(i*i%==digit[])
{
r=i<<; //r为余数2*ans
solve(,,i);
}
}
if(final==INF)
puts("None");
else
printf("%I64d\n",final);
}
return ;
}

当然也可以不用这么麻烦直接dfs

只是时间问题。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath> using namespace std;
typedef __int64 ll; struct Node
{
ll num;
int len;//长度
bool operator < (const Node &p) const
{
return p.num<num;
}
};
ll n,ans; ll kpow(int x)
{
ll kk=;
for(int i=;i<x;i++)
kk=kk*;
return kk;
}
bool bfs()
{
priority_queue<Node>Q;
Node p,q;
p.num=,p.len=;
Q.push(p);
while(!Q.empty())
{
p=Q.top();
Q.pop();
ll tmp=kpow(p.len);
if(p.num*p.num%tmp==n)
{
ans=p.num;
return true;
}
//扩展
for(int i=; i<; i++)
{
q.len=p.len+;
q.num=p.num+i*tmp;
if(q.num*q.num%(tmp*)==n%(tmp*))
Q.push(q);
}
}
return false;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%I64d",&n);
int temp=n%;
if(temp==||temp==||temp==||temp==)
{
puts("None");
continue;
}
if(bfs())
printf("%I64d\n",ans);
else
puts("None");
}
return ;
}

Digital Square(hdu4394)搜索的更多相关文章

  1. Digital Square 搜索

    Digital Square Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  2. hdu 4394 Digital Square(bfs)

    Digital Square Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. HDU 4394 Digital Square

    Digital Square Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. hdu Digital Square(广搜)

    题目:给出n,求出最小的m,满足m^2  % 10^k = n,其中k=0,1,2 http://acm.hdu.edu.cn/showproblem.php?pid=4394 只要有一个x满足条件便 ...

  5. 2012 Multi-University #10

    容斥原理 A Number Sequence 题意:给出n个数,b1,b2,b3……bn,构造n个数,a1,a2,……an(ai>1),使得a1*a2*a3……an=b1*b2……bn 分析:容 ...

  6. Project Euler 80:Square root digital expansion 平方根数字展开

    Square root digital expansion It is well known that if the square root of a natural number is not an ...

  7. ural 1698. Square Country 5(记忆化搜索)

    1698. Square Country 5 Time limit: 2.0 secondMemory limit: 64 MB The first arithmetical operation ta ...

  8. 杭电1518 Square(构成正方形) 搜索

    HDOJ1518 Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square)

    Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square) 深度优先搜索的解题详细介绍,点击 还记得童话<卖火柴的小女孩>吗?现在, ...

随机推荐

  1. Docker学习笔记——制作容器与容器概念

    Docker能做些什么? 1.docker能够解决虚拟机能够解决的问题 2.隔离应用依赖 3.创建应用镜像并复制 4.创建容易分发的即启即用的应用 5.docker的想法是创建软件程序可移植的轻量容器 ...

  2. FFmpeg简易播放器的实现-视频播放

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  3. POI中文API文档

    一. POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二. HSSF概况 HSSF 是 ...

  4. Linux系统VIM编辑器管理(2)

    VI/VIM模式概述 在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了,与微软的 Windows 系统不同的是,如果你用惯了 ...

  5. KVM虚拟机配置

    KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的,KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存. 在 ...

  6. solr 加载 停用/扩展词典

    startup.bat 停止词典的效果

  7. Flash 0day漏洞(CVE-2018-4878)复现

    该漏洞影响 Flash Player 当前最新版本28.0.0.137以及之前的所有版本,而Adobe公司计划在当地时间2月5日紧急发布更新来修复此漏洞. 本文作者:i春秋作家——F0rmat 前言 ...

  8. underscore.js源码研究(7)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  9. js获取n分钟(或n小时或n个月)后(或前)的时间(日期)

    标题有点绕,其实意思就是根据系统当前时间,获取n分钟或n小时或n个月后的时间. 例如:当前时间下,获取10分钟后的时间. var date=new Date(); //1. js获取当前时间 var ...

  10. 简单介绍RPM包制作方法

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.使用r ...