hdu 4394 Digital Square(bfs)

Digital Square

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


Problem Description
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
 

Source
 

Recommend
zhuyuanchen520
 

题意:给出N,找出满足M2%10x=N的M

题解:可知,若N有多少位,M的多少位就可以确定下来,这样用bfs搜索一次就可以了


#include<cstdio>
#include<queue>
using namespace std;
long long n,cc[23];
struct node{
    long long now;
    int len,next;
    node(){}
    node(long long _n,int _l,int _nex):now(_n),len(_l),next(_nex){}
    bool operator < (const node n1) const
    {
        return now>n1.now;
    }
}x,y;
void bfs()
{
    priority_queue<node>q;
    long long temp=n,l=0;

    while(temp){ l++; temp/=10; }
    q.push(node(0,0,0));
    while(!q.empty())
    {
        x=q.top();
        q.pop();
        if(x.len==l){ printf("%I64d\n",x.now); return; }
        if(x.next!=9) q.push(node(x.now,x.len,x.next+1));
        y=node(x.now,x.len+1,0);
        y.now=y.now+cc[x.len]*x.next;
        if((y.now*y.now)%cc[y.len]==n%cc[y.len]) q.push(y);
    }
    printf("None\n");
}
int main()
{
    int t,i;

    for(cc[0]=i=1;i<=20;i++) cc[i]=cc[i-1]*10;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d",&n);
        bfs();
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值