题目链接:1426 -- Find The Multiple
题意:给你一个n,然后让你输出任意一个非零十进制数m使得m是n的倍数且m的十进制表达式中只含有0或1.
这道题显然直接进行dfs搜索就行,但是需要我们剪枝,搜索过程中需要记录两个值,一个是当前搜索到的十进制数,另一个是当前搜索到的位数,剪枝就从搜索到的位数方面开始考虑,若当前搜索到了18位即以后就默认未找到答案,十进制最高位我们i肯定是要从1开始的
需要提醒的是剪枝一定要从18位剪 ,19位会超longlong,但是17位可能搜不到答案,这也是我wa了好多发的原因,其他就没什么了,下面上代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll n,ans;
void dfs(ll r,ll pos)
{
if(pos>18||ans) return ;//注意剪枝
if(r%n==0&&r)
{
ans=r;
return ;
}
dfs(r*10,pos+1);
dfs(r*10+1,pos+1);
}
int main()
{
while(scanf("%lld",&n)&&n)
{
ans=0;
dfs(1,0);
printf("%lld\n",ans);
}
return 0;
}