题目大意:给你一个整数N,让你找一整数M是N的整数倍数且整数M是由0和1组成的
解题思路:这是一道以前做过的题,不过现在再次来看,又有不同的思考。
不过核心思想还是一个:N的范围是1~200,那么这个整数M最多不超过20位(别问我为什么,因为爱情)
而且M上的数字不是1就是0,那么就可以用枚举的算法了;
这里我还写了两种方法:
1、用BFS,这样思路清晰,而且效率也够快。就是在前面的情况上填1和0两种情况,不过不好想
2、用数字来表示二进制,如1表示00000000001,5表示0000000101,这样再用位运算将数字转化成M
代码:
BFS
#include <set> #include <map> #include <list> #include <queue> #include <stack> #include <cmath> #include <string> #include <cstdio> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define PB push_back #define SIZE(x) (int)x.size() #define clr(x,y) memset(x,y,sizeof(x)) #define FOR(i,n,m) for(int i=n;i<=m;i++) #define ROF(i,n,m) for(int i=n;i>=m;i--) #define IT iterator #define maxn 200+5 typedef long long ll; void RI(int& x) { x=0; char c=getchar(); while(!((c>='0'&&c<='9')||c=='-'))c=getchar(); bool flag=1; if(c=='-') { flag=0; c=getchar(); } while(c<='9'&&c>='0') { x=x*10+c-'0'; c=getchar(); } if(!flag)x=-x; } void RII(int& x,int& y) { RI(x);RI(y); } void RIII(int& x,int& y,int& z) { RI(x);RI(y);RI(z); } /*************************DEADLINE*************************************/ bool vis[maxn]; int a; queue<ll>q; long long dfs() { clr(vis,false); while(!q.empty())q.pop(); q.push(1); while(!q.empty()) { ll tem=q.front(); q.pop(); int n=tem%a; if(n==0)return tem; if(!vis[n]) { vis[n]=true; FOR(i,0,1) { ll x=tem*10+i; q.push(x); } } } } int main() { while(scanf("%d",&a),a) { printf("%lld\n",dfs()); } return 0; }
#include <set> #include <map> #include <list> #include <queue> #include <stack> #include <cmath> #include <string> #include <cstdio> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define PB push_back #define FOR(i,n,m) for(int i=n;i<=m;i++) #define ROF(i,n,m) for(int i=n;i>=m;i--) #define clr(i,j) memset(i,j,sizeof(i)) #define maxn 17 typedef long long ll; int main() { int n,upper=1<<20; while(scanf("%d",&n),n) { ll res; for(int i=1;i<upper;i++) { res=0; ll e=1; for(int j=0;j<20;j++) { if((i>>j)&1)res+=e; e=e*10; } if(res%n==0)break; } printf("%lld\n",res); } return 0; }