您的位置:首页 > 其它

1109 01组成的N的倍数

2016-09-05 22:50 267 查看
1109 01组成的N的倍数
基准时间限制:1 秒 空间限制:131072 KB

给定一个自然数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
和http://www.cnblogs.com/zzuli2sjy/p/5731745.html一样;


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include<set>
using namespace std;
typedef long long LL;
bool flag[6000000];
int ans[20];
set<int>que;
set<int>::iterator it;
typedef struct pp
{
int mod;
int id;
int pre;
int digit;
pp()
{
pre=-1;
}
} ss;
ss bns[1000000];
int ask[1000000];
int cp[2000000];
int  bfs(int n,int m);
int main(void)
{
int i,j,k;
while(scanf("%d",&k)!=EOF)
{
int n;
int m;
que.clear();
cp[0] = 0;cp [1] = 1;
n = 2;
ans[0]=cp[0];
int uu=cp[0];
int t=1;
for(i=1;i<n;i++)
{
if(cp[i]!=uu)
{
ans[t++]=cp[i];
uu=cp[i];
}
}

if(k==0)printf("0\n");
else
{
int sum=0;
int id=bfs(t,k);
if(id==-1)
{
printf("0\n");
}
else
{
while(id!=-1)
{
ask[sum++]=bns[id].digit;
id=bns[id].pre;
}
for(i=sum-1; i>=0; i--)
{
printf("%d",ask[i]);
}
printf("\n");
}
}
}
return 0;
}
int  bfs(int n,int m)
{
int i,j,k;
int kk=0;
memset(flag,0,sizeof(flag));
queue<ss>stc;
for(i=0; i<n; i++)
{
int mod=ans[i]%m;
if(!flag[mod]&&ans[i]!=0)
{
flag[mod]=true;
bns[kk].id=kk;
bns[kk].mod=mod;
bns[kk].pre=-1;
bns[kk].digit=ans[i];
stc.push(bns[kk]);
kk++;
}
}
while(!stc.empty())
{
ss tt=stc.front();
stc.pop();
for(i=0; i<n; i++)
{
int mod=(tt.mod*10+ans[i])%m;
if(!flag[mod])
{
bns[kk].id=kk;
bns[kk].pre=tt.id;
bns[kk].mod=mod;
bns[kk].digit=ans[i];
if(mod==0)
{
return kk;
}
stc.push(bns[kk]);
kk++;
flag[mod]=true;
}
}
}
return -1;
}



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