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. AJPFX平台:中国的经济是个大泡沫吗?这个泡沫即将崩解吗?

    AJPFX问:中国的经济是个大泡沫吗?这个泡沫即将崩解吗? 这一老问题,最近又一次引起世界的关注. 首先,中国在领导层变更之际,把2013年的增长目标定为7.5%,“保八”的调子不再,两位数高增长的时 ...

  2. ubuntu14.04 下出现 libmysqlclient.so.20 找不到问题

    解决办法: apt-get install libzdb-dev

  3. python项目实现配置统一管理的方法

    一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数.最近看了不少的python项目,总结了两种很有意思的配置管理方法. 第一种 基于easydict实现的配置管理 首先需 ...

  4. python中a,b=b,a原理

    python中 a , b = b , a 可以将  a  和  b  的值交换 >>> a = 1 >>> b = 2 >>> a , b = ...

  5. D3.js的基础部分之数组的处理 数组的排序和求值(v3版本)

    操作数组   D3提供了将数组洗牌.合并等操作,使用起来是很方便的.   d3.shuffle(array,[,lo[,ji]]) : //随机排列数组. d3.merge(arrays) :   / ...

  6. postgresql-查看表大小

    drop table tablesize create table tablesize( phone int) create table tablesize( phone text) create t ...

  7. 在没有任何投票节点情况下将从节点转换为Primary节点脚本

    cfg={ "_id": "rs01", "version": 2, "protocolVersion": Number ...

  8. Python如何判断字符串中是否有中文

    解决:Python如何判断字符串中是否有中文 In [240]: s Out[240]: '你好aa' In [241]: for i in s: ...: if u'\u4e00' <= i ...

  9. 【sping揭秘】8、容器内部事件发布(一)

    容器内部事件发布 Spring的applicationContext容器提供的容器内事件发布功能,是通过java提供的自定义事件实现的 事件类型:eventObject 类继承 事件监听:eventL ...

  10. hdu5745--La Vie en rose (DP+bitset)

    好题,学到新姿势! 题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以).求a中 ...