← Back to Forum
CCC '23 S5 - The Filter Solution
//By Timothy Shnayder, Newmarket Highschool
//To solve this problem, we first do a rough filter, then remove the bad ones with a precise filter
#include <iostream>
#include <math.h>
#include <unordered_map>
#include <vector>
#define int long long
using namespace std;
double n;
vector<int> finalN;
//first do a rough check to get the working numbers + some bad ones we will get rid of later
void filter(double l, double r, int iteration){
if(iteration == 0){ // end of filters
for(int i = ceil(l); i <= floor(r); i++){
finalN.push_back(i);
}
}else{//not final iteration
//split into 3 sections seperated by these edge markers
double leftEdge = (r-l)/3 + l;
double rightEdge = 2*(r-l)/3 + l;
//search into left and right ones. Middle is discarded
filter(l, leftEdge, iteration-1);
filter(rightEdge, r, iteration-1);
}
}
//our goal is to to find if its in cantor without using doubles because it's inaccurate
//if it reaches some int more than once, that means it will cycle and it is in the cantor
//if it hits the middle, its bad
bool preciseFilter(int x){
if(x == 0){
return true;
}
unordered_map<int, bool> cycle;
while(true){
if(x*3 <= n){//left side
x*=3;
if(cycle[x]){
return true;
}
cycle[x] = true;
}else if(x*3 >= n*2){//right side
x*=3;
x-=n*2;
if(cycle[x]){
return true;
}
cycle[x] = true;
}else{ //middle
return false;
}
}
}
signed main() {
cin >> n;
filter(0.0, n, 20);
for(auto i: finalN){
if(preciseFilter(i)){
cout << i << '\n';
}
}
return 0;
}
By timshnayder on 10/15/2024
0
Comments
Added, thank you
By Admin on 10/17/2024