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