假期结束开始正常打卡
Find The Multiple
题目描述:给一个数,输出这个数的倍数且这个数是一个只有0和1组成的数。
首先想到的就是暴力但是没过qwq,题目时间限制1s暴力绝对会TLE,那么怎么去思考呢,想暴力就得优化,怎么优化呢,我们知道我们遍历的数一定是只有0和1构成的那么我们只遍历0和1就好了,那就是从1开始*10或*10+1就可以做到只遍历01数。传统的for不能很好地调控*10或*10+1,所以选择bfs去通过入队进队来遍历,很nice!
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define int long long
int bfs(int x){
std::queue<int> q;
q.push(1);
while(!q.empty()){
int t = q.front();
q.pop();
if(t % x == 0){
return t;
}
q.push(t * 10);
q.push(t * 10 + 1);
}
return -1;
}
signed main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int x;
while(std::cin >> x, x != 0){
std::cout << bfs(x) << "\n";
}
return 0;
}
更快的做法把打出的表,填到excel表,O(1)就能过。
#include <iostream>
long long a[300] = {0, 1, 10, 111, 100, 10, 1110, 1001, 1000, 111111111, 10, 11, 11100, 1001, 10010, 1110, 10000, 11101, 1111111110, 11001, 100, 10101, 110, 110101, 111000, 100, 10010, 1101111111, 100100, 1101101, 1110, 111011, 100000, 111111, 111010, 10010, 11111111100, 111, 110010, 10101, 1000, 11111, 101010, 1101101, 1100, 1111111110, 1101010, 10011, 1110000, 1100001, 100, 100011, 100100, 100011, 11011111110, 110, 1001000, 11001, 11011010, 11011111, 11100, 100101, 1110110, 1111011111, 1000000, 10010, 1111110, 1101011, 1110100, 10000101, 10010, 10011, 111111111000, 10001, 1110, 11100, 1100100, 1001, 101010, 10010011, 10000, 1111111101, 111110, 101011, 1010100, 111010, 11011010, 11010111, 11000, 11010101, 1111111110, 1001, 11010100, 10000011, 100110, 110010, 11100000, 11100001, 11000010, 111111111111111111, 100, 101, 1000110, 11100001, 1001000, 101010, 1000110, 100010011, 110111111100, 1001010111, 110, 111, 10010000, 1011011, 110010, 1101010, 110110100, 10101111111, 110111110, 100111011, 111000, 11011, 1001010, 10001100111, 11101100, 1000, 11110111110, 11010011, 10000000, 100100001, 10010, 101001, 11111100, 11101111, 11010110, 11011111110, 11101000, 10001, 100001010, 110110101, 100100, 10011, 100110, 1001, 1111111110000, 11011010, 100010, 1100001, 11100, 110111, 11100, 1110001, 11001000, 10111110111, 10010, 1110110, 1010100, 10101101011, 100100110, 100011, 100000, 11101111, 11111111010, 1010111, 1111100, 1111110, 1010110, 11111011, 10101000, 10111101, 111010, 1111011111, 110110100, 1011001101, 110101110, 100100, 110000, 100101111, 110101010, 11010111, 11111111100, 1001111, 10010, 100101, 110101000, 1110, 100000110, 1001011, 1001100, 1010111010111, 110010, 11101111, 111000000, 11001, 111000010, 101010, 110000100, 1101000101, 1111111111111111110, 111000011, 1000};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
long long n;
while (std::cin >> n && n != 0) {
std::cout << a[n] << "\n";
}
return 0;
}