[kuangbin带你飞]专题一 简单搜索 Find The Multiple :dfs

题意

给一个正整数n,找出m,使得m是n的倍数,且m的十进制表示只包含“0”和“1”。

其中 1<=n<=200,m的十进制位数<100;

如果有多个解,输出任意一种解。


分析:

由于m的位数是<100的,而题目没有说 如果找不到这样的m,就输出“no”等等 这样的信息,所以,m一定可以找到!

那么,真的枚举100位的十进制数m,怎么判定m是不是n的倍数呢? m没办法存储。

又注意到 n=6的时候,样例给的结果是 m=100100100100100100,很明显m还可以是 1110.

所以猜想: 不需要搜索100位,就可以找出m的解。

那么m到底应该搜索多少位呢?我们看下long long的范围  2^63 =8*(2^10)^6=8*(10^18);

所以,用longlong来存储m的值,最多可以搜索 19位。


第一次代码,RE的错误,这题还有内存的限制,存储空间比较小,反正这么写会RE:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace  std;

typedef long long ll;
int ok;

ll get(ll i){

    ll ret=0;
    long long len=0;
    
    for(;(1<<len)<=i;len++);
    len--;
    
    while(len>=0){
        ret=ret*10+((i&(1<<len))==(1<<len));
        len--;
    }
  
    return ret;
}



int main(int argc, const char * argv[]) {
    
    ll n;
    while(~scanf("%lld",&n)){
    
        ok=0;
        for(ll i=1;i<=(1<<19);i++)
        {
            ll mul=get(i);
            
            if(mul%n==0) {
                ok=1;
               // printf("i=%lld mul=%lld \n",i,mul);
                printf("%llu\n",mul);
                break;
            }
        }
        if(!ok) puts("no");
    
    }
    
    
    
    return 0;
}



第二次,没用什么变量,AC
 388KB,172ms

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace  std;

typedef long long  ll;

ll n,ans;

void dfs(ll wei,ll tot){ //wei表示当前的tot总共有多少位。
    if(ans!=-1) return;
    if(wei>19) return;
    if(tot%n==0) {ans=tot; return;}
    bfs(wei+1,tot*10);
    bfs(wei+1,tot*10+1);

}


int main(){
    
    while(~scanf("%lld",&n) && n){
    
        ans=-1;
        dfs(1,1);
        printf("%lld\n",ans);
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值