您的位置:首页 > 其它

51Nod——T 1109 01组成的N的倍数

2017-09-14 20:57 253 查看

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1109

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1。求最小的M。   例如:N = 4,M = 100。 Input
输入1个数N。(1 <= N <= 10^6)
Output
输出符合条件的最小的M。
Input示例
4
Output示例
100


搜索+同余定理剪枝、
每次入队 (队首*10+0/1)%n 的点,若x%n!=0,则abcdx%n!=0,
所以记录每次的余数,已经出现过的就不能出解不用入队了
#include <cstdio>
#include <queue>

const int N(1e6+5);
int pre
,ans
,n;
std::queue<int>que;

void cout(int x)
{
if(x==-1) return ;
cout(pre[x]);
printf("%d",ans[x]);
}

int Presist()
{
scanf("%d",&n);
pre[1]=-1; ans[1]=1; que.push(1);
for(int u,v; !que.empty(); )
{
u=que.front();
que.pop();
v=(u*10)%n;
if(v==0)
{
cout(u);
puts("0");
break;
}
if(!pre[v])
{
pre[v]=u;
ans[v]=0;
que.push(v);
}
v=(u*10+1)%n;
if(v==0)
{
cout(u);
puts("1");
break;
}
if(!pre[v])
{
pre[v]=u;
ans[v]=1;
que.push(v);
}
}
return 0;
}

int Aptal=Presist();
int main(){;}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: