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

来源:互联网 发布:淘宝如何批量上传宝贝 编辑:程序博客网 时间:2024/05/16 11:43

题意

给一个正整数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;}


0 0
原创粉丝点击