IDS
This commit is contained in:
		
							
								
								
									
										14
									
								
								Algorithm/Divide&Conquer/最大连续和.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Algorithm/Divide&Conquer/最大连续和.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
using namespace std;
 | 
			
		||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ұߣ<D2B1><DFA3><EFBFBD>Խ<EFBFBD>м<EFBFBD> 
 | 
			
		||||
vector<int> arr;
 | 
			
		||||
 | 
			
		||||
int dfs(int l, int r){
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(){
 | 
			
		||||
	
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI-BAD.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI-BAD.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
#include <bits/stdc++.h>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
vector<int> best_solution;   // <20><>ǰ<EFBFBD><C7B0><EFBFBD>Ž<EFBFBD>
 | 
			
		||||
int best_max_den = INT_MAX;  // <20><>ǰ<EFBFBD><C7B0><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
 | 
			
		||||
// gcd <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
long long gcd(long long a, long long b) {
 | 
			
		||||
    return b == 0 ? a : gcd(b, a % b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DFS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
void dfs(vector<int>& path, int step, int max_depth,
 | 
			
		||||
         long long num, long long den, int a, int b, int start) {
 | 
			
		||||
    if(step > max_depth) return;
 | 
			
		||||
 | 
			
		||||
    if(num * b == den * a) {
 | 
			
		||||
        int cur_max = *max_element(path.begin(), path.end());
 | 
			
		||||
        if(best_solution.empty() || cur_max < best_max_den) {
 | 
			
		||||
            best_solution = path;
 | 
			
		||||
            best_max_den = cur_max;
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD><EFBFBD>֦
 | 
			
		||||
    long long i_start = max((long long)start, (den + num - 1) / num); // ceil(den/num)
 | 
			
		||||
    for(long long i = i_start; i <= 15000; i++) {
 | 
			
		||||
        path.push_back(i);
 | 
			
		||||
        long long new_num = num * i + den;
 | 
			
		||||
        long long new_den = den * i;
 | 
			
		||||
        long long g = gcd(new_num, new_den);
 | 
			
		||||
        new_num /= g;
 | 
			
		||||
        new_den /= g;
 | 
			
		||||
        if(new_num * b <= new_den * a) { // <20><>֦
 | 
			
		||||
            dfs(path, step + 1, max_depth, new_num, new_den, a, b, i + 1);
 | 
			
		||||
        }
 | 
			
		||||
        path.pop_back();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IDS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
vector<int> egyptian_fraction(int a, int b) {
 | 
			
		||||
    best_solution.clear();
 | 
			
		||||
    best_max_den = INT_MAX;
 | 
			
		||||
 | 
			
		||||
    for(int depth = 1; depth <= 15000; depth++) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿɵ<C8BF>
 | 
			
		||||
        vector<int> path;
 | 
			
		||||
        dfs(path, 0, depth, 0, 1, a, b, 1);
 | 
			
		||||
        if(!best_solution.empty()) break; // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>̳<EFBFBD><CCB3>Ƚ<EFBFBD>
 | 
			
		||||
    }
 | 
			
		||||
    return best_solution;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    int a, b;
 | 
			
		||||
    cin >> a >> b;
 | 
			
		||||
    vector<int> res = egyptian_fraction(a, b);
 | 
			
		||||
    for(int x : res) cout << x << " ";
 | 
			
		||||
    cout << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										143
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
			
		||||
#include <bits/stdc++.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
typedef long long ll; // ʹ<><CAB9> long long <20>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4>ķ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>GCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
 | 
			
		||||
ll gcd(ll a, ll b) {
 | 
			
		||||
    return b == 0 ? a : gcd(b, a % b); // շת<D5B7><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> n/d Լ<><D4BC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
 | 
			
		||||
pair<ll, ll> reduce(ll n, ll d) {
 | 
			
		||||
    ll g = gcd(abs(n), d); // <20><><EFBFBD><EFBFBD> n <20><> d <20><> GCD<43><44>abs(n) <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    return {n / g, d / g}; // <20><><EFBFBD><EFBFBD>Լ<EFBFBD>ֺ<EFBFBD><D6BA>ķ<EFBFBD><C4B7>Ӻͷ<D3BA>ĸ
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>Ľṹ<C4BD><E1B9B9>
 | 
			
		||||
struct State {
 | 
			
		||||
    ll num, den; // <20><>ǰʣ<C7B0><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> num/den
 | 
			
		||||
    vector<ll> dens; // <20><>ѡ<EFBFBD><D1A1><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ĸ<EFBFBD>б<EFBFBD>
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD>㵱ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
    ll max_den() const {
 | 
			
		||||
        if (dens.empty()) return 0; // <20><><EFBFBD><EFBFBD>û<EFBFBD>з<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
 | 
			
		||||
        return *max_element(dens.begin(), dens.end()); // <20><><EFBFBD>ط<EFBFBD>ĸ<EFBFBD>б<EFBFBD><D0B1>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// <20><>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unordered_set <20>д洢״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>δʹ<CEB4>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>չ<EFBFBD><D5B9>
 | 
			
		||||
struct StateHash {
 | 
			
		||||
    size_t operator()(const State& s) const {
 | 
			
		||||
        string str;
 | 
			
		||||
        for (ll x : s.dens) str += to_string(x) + ",";
 | 
			
		||||
        str += to_string(s.num) + "/" + to_string(s.den);
 | 
			
		||||
        return hash<string>()(str);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// <20><>ȡ<EFBFBD><C8A1>ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>״̬
 | 
			
		||||
vector<State> get_successors(const State& state, int limit, int depth) {
 | 
			
		||||
    vector<State> res; // <20>洢<EFBFBD><E6B4A2><EFBFBD>п<EFBFBD><D0BF>ܵĺ<DCB5><C4BA><EFBFBD>״̬
 | 
			
		||||
    ll r = state.num, s = state.den; // <20><>ǰʣ<C7B0><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> r/s
 | 
			
		||||
    if (r == 0) return res; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
 | 
			
		||||
 | 
			
		||||
    // ȷ<><C8B7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> r/s >= 1/d
 | 
			
		||||
    ll last_d = state.dens.empty() ? 0 : state.dens.back();
 | 
			
		||||
    ll min_d = max(last_d + 1, (s + r - 1) / r); // min_d = ceil(s/r)
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD>÷<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    const ll MAX_D = 10000000LL; // <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    // ö<>ٿ<EFBFBD><D9BF>ܵĵ<DCB5>λ<EFBFBD><CEBB>ĸ d
 | 
			
		||||
    for (ll d = min_d; d <= MAX_D; ++d) {
 | 
			
		||||
        // <20>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ಽ<EFBFBD><E0B2BD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻<EFBFBD><E3B9BB>ʾʣ<CABE><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        int rem_steps = limit - depth - 1; // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
 | 
			
		||||
        double max_sum_after = 0.0; // ʣ<>ಽ<EFBFBD><E0B2BD><EFBFBD>ܱ<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        for (int i = 1; i <= rem_steps; ++i) {
 | 
			
		||||
            max_sum_after += 1.0 / (d + i); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>
 | 
			
		||||
        }
 | 
			
		||||
        double this_contrib = 1.0 / d; // <20><>ǰ<EFBFBD><C7B0>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
 | 
			
		||||
        double target = (double)r / s; // Ŀ<><C4BF>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><D7BC>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ŀ<EFBFBD>꣬<EFBFBD><EAA3AC>֦
 | 
			
		||||
        if (this_contrib + max_sum_after < target - 1e-10) break;
 | 
			
		||||
 | 
			
		||||
        // <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>r/s - 1/d = (r*d - s) / (s*d)
 | 
			
		||||
        ll new_num = r * d - s;
 | 
			
		||||
        if (new_num < 0) continue; // <20>·<EFBFBD><C2B7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>״̬
 | 
			
		||||
        ll new_den = s * d;
 | 
			
		||||
        auto p = reduce(new_num, new_den); // Լ<><D4BC><EFBFBD>·<EFBFBD><C2B7><EFBFBD>
 | 
			
		||||
        State ns = {p.first, p.second, state.dens}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
 | 
			
		||||
        ns.dens.push_back(d); // <20><><EFBFBD>ӵ<EFBFBD>ǰ<EFBFBD><C7B0>λ<EFBFBD><CEBB>ĸ
 | 
			
		||||
        res.push_back(ns); // <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DFS<46><53><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
void dfs(const State& state, int depth, int limit, vector<State>& solutions) {
 | 
			
		||||
    if (depth > limit) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    if (state.num == 0 && !state.dens.empty()) { // <20>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD>Ϊ 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
        solutions.push_back(state); // <20><>¼<EFBFBD><C2BC>
 | 
			
		||||
        return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>·<EFBFBD><C2B7>
 | 
			
		||||
    }
 | 
			
		||||
    // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>״̬
 | 
			
		||||
    for (const auto& next : get_successors(state, limit, depth)) {
 | 
			
		||||
        dfs(next, depth + 1, limit, solutions); // <20>ݹ<EFBFBD><DDB9><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDS<44><53><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>С<EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
State find_best_egyptian(ll a, ll b) {
 | 
			
		||||
    auto p = reduce(a, b); // Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    State start = {p.first, p.second, {}}; // <20><>ʼ״̬
 | 
			
		||||
    State best; // <20><>¼<EFBFBD><C2BC><EFBFBD>ѽ<EFBFBD>
 | 
			
		||||
    ll best_max = LLONG_MAX; // <20><><EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
    int limit = 0; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    while (true) {
 | 
			
		||||
        ++limit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
        vector<State> solutions; // <20>洢<EFBFBD><E6B4A2>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>н<EFBFBD>
 | 
			
		||||
        dfs(start, 0, limit, solutions); // ִ<><D6B4> DFS
 | 
			
		||||
        if (!solutions.empty()) { // <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>
 | 
			
		||||
            for (const auto& s : solutions) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD>
 | 
			
		||||
                ll cur_max = s.max_den(); // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
                if (cur_max < best_max) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD>
 | 
			
		||||
                    best = s;
 | 
			
		||||
                    best_max = cur_max;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return best; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD>
 | 
			
		||||
        }
 | 
			
		||||
        if (limit > 100) { // <20><>ȫ<EFBFBD><C8AB><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
 | 
			
		||||
            cout << "No solution found within limit." << endl;
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    ll a, b;
 | 
			
		||||
    // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻͷ<D3BA>ĸ<EFBFBD><C4B8>Ҫ<EFBFBD><D2AA> 0 < a < b <20>һ<EFBFBD><D2BB><EFBFBD>
 | 
			
		||||
    cout << "Enter numerator and denominator (a b, with 0 < a < b, gcd=1): ";
 | 
			
		||||
    cin >> a >> b;
 | 
			
		||||
    if (a >= b || a <= 0 || gcd(a, b) != 1) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
 | 
			
		||||
        cout << "Invalid input: require 0 < a < b and gcd(a,b)=1" << endl;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    State result = find_best_egyptian(a, b); // Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
    cout << a << "/" << b << " = ";
 | 
			
		||||
    for (size_t i = 0; i < result.dens.size(); ++i) {
 | 
			
		||||
        if (i > 0) cout << " + ";
 | 
			
		||||
        cout << "1/" << result.dens[i]; // <20><>ӡ<EFBFBD><D3A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
 | 
			
		||||
    }
 | 
			
		||||
    cout << endl;
 | 
			
		||||
    cout << "Length: " << result.dens.size() << endl; // <20><>ӡ<EFBFBD>ֽⳤ<D6BD><E2B3A4>
 | 
			
		||||
    cout << "Max denominator: " << result.max_den() << endl; // <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI.exe
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-AI.exe
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										49
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-BAD.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								Algorithm/IterativeDeepening/Egypt-Fraction-BAD.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <cmath>
 | 
			
		||||
using namespace std;
 | 
			
		||||
// f = a/b
 | 
			
		||||
double checkv(const vector<int>& x){
 | 
			
		||||
	double c = 0.0;
 | 
			
		||||
	for(auto q : x){
 | 
			
		||||
		c += 1.0 / q;
 | 
			
		||||
	}
 | 
			
		||||
	return c;
 | 
			
		||||
	//return fabs(c - r) < 1e-9;  // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƱȽ<C6B1>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//<2F><>step<65><70>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ 
 | 
			
		||||
bool dfs(vector<int>& path, int step, int max_depth, int a, int b, int max_val){
 | 
			
		||||
	double r = static_cast<double>(a) / b;
 | 
			
		||||
    if(fabs(checkv(path) - r) < (1e-9)){
 | 
			
		||||
        for(int x : path) cout << x << " ";
 | 
			
		||||
        cout << endl;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    if(checkv(path) > r + (1e-9)) return false;
 | 
			
		||||
    if(step == max_depth) return false;
 | 
			
		||||
 | 
			
		||||
    int start = path.empty() ? 1 : path.back();
 | 
			
		||||
    for(int i = start; i <= max_val; i++){
 | 
			
		||||
        path.push_back(i);
 | 
			
		||||
        if(dfs(path, step + 1, max_depth, a, b, max_val)) return true;
 | 
			
		||||
        path.pop_back();
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ids(int limit, int a, int b, int max_val){
 | 
			
		||||
    for(int depth = 1; depth <= limit; depth++){
 | 
			
		||||
        vector<int> path;
 | 
			
		||||
        if(dfs(path, 0, depth, a, b, max_val)) return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(){
 | 
			
		||||
	int aa, bb, max;
 | 
			
		||||
	cin >> aa >> bb;
 | 
			
		||||
	max = 200;
 | 
			
		||||
	ids(10, aa, bb, max);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								Algorithm/IterativeDeepening/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Algorithm/IterativeDeepening/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
🔹 基本思想
 | 
			
		||||
 | 
			
		||||
广度优先搜索 (BFS):逐层扩展,能保证找到最优解,但需要大量内存。
 | 
			
		||||
 | 
			
		||||
深度优先搜索 (DFS):沿一条路径搜索下去,内存消耗小,但可能陷入深层无解分支,不能保证最优解。
 | 
			
		||||
 | 
			
		||||
**迭代加深搜索 (IDS) 的做法是:**
 | 
			
		||||
 | 
			
		||||
设定一个最大搜索深度限制(depth limit),先用 DFS 在这个深度内搜索。
 | 
			
		||||
 | 
			
		||||
如果没找到解,就把深度限制增加 1,再次用 DFS 搜索。
 | 
			
		||||
 | 
			
		||||
重复以上过程,直到找到目标或达到全局深度上限。
 | 
			
		||||
 | 
			
		||||
> 重点是树没有上限的情况->棋类竞技
 | 
			
		||||
							
								
								
									
										100
									
								
								std-Cpp/BitWiseOperation/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								std-Cpp/BitWiseOperation/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
好嘞 👍 你问到的 **C++ 位运算符**,其实是底层操作里最常用的一类。它们直接对整数的**二进制位**进行操作,比算术运算更接近硬件。
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🔑 C++ 位运算符总览
 | 
			
		||||
 | 
			
		||||
| 运算符             | 名称         | 含义                                               | 示例(假设 `a = 6 (0110₂)`, `b = 11 (1011₂)`) | 结果          |    |
 | 
			
		||||
| --------------- | ---------- | ------------------------------------------------ | ---------------------------------------- | ----------- | -- |
 | 
			
		||||
| `&`             | 按位与 (AND)  | 对应位都为 1 才为 1                                     | `a & b = 0010₂`                          | 2           |    |
 | 
			
		||||
| <code>\|</code> | 按位或 (OR)   | 对应位至少一个为 1 就为 1                                  | \`a                                      | b = 1111₂\` | 15 |
 | 
			
		||||
| `^`             | 按位异或 (XOR) | 对应位相同为 0,不同为 1                                   | `a ^ b = 1101₂`                          | 13          |    |
 | 
			
		||||
| `~`             | 按位取反 (NOT) | 0 变 1,1 变 0                                      | `~a = ...11111001₂`                      | -7(补码表示)    |    |
 | 
			
		||||
| `<<`            | 左移         | 所有二进制位向左移,右边补 0                                  | `a << 1 = 1100₂`                         | 12          |    |
 | 
			
		||||
| `>>`            | 右移         | 所有二进制位向右移,左边补符号位(算术右移)或 0(逻辑右移,C++ 对有符号数实现依赖编译器) | `a >> 1 = 0011₂`                         | 3           |    |
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 📘 详细解释
 | 
			
		||||
 | 
			
		||||
### 1. 按位与 `&`
 | 
			
		||||
 | 
			
		||||
常用来 **取某些位**:
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int x = 13;        // 1101₂
 | 
			
		||||
int mask = 4;      // 0100₂
 | 
			
		||||
if (x & mask) cout << "第3位是1" << endl; // 输出 第3位是1
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 2. 按位或 `|`
 | 
			
		||||
 | 
			
		||||
常用来 **设置某些位为 1**:
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int x = 5;         // 0101₂
 | 
			
		||||
int mask = 2;      // 0010₂
 | 
			
		||||
x = x | mask;      // 0111₂ -> 7
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 3. 按位异或 `^`
 | 
			
		||||
 | 
			
		||||
* 不同为 1,相同为 0。
 | 
			
		||||
* 特性:`a ^ a = 0`,`a ^ 0 = a`。
 | 
			
		||||
* 常用于 **交换变量** 或 **求对称差**。
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int a = 5, b = 9;
 | 
			
		||||
a = a ^ b;
 | 
			
		||||
b = a ^ b;
 | 
			
		||||
a = a ^ b;
 | 
			
		||||
cout << a << " " << b << endl; // 输出 9 5
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 4. 按位取反 `~`
 | 
			
		||||
 | 
			
		||||
逐位取反。注意负数结果与补码有关:
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int a = 6; // 0000...0110
 | 
			
		||||
cout << ~a << endl; // -7
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 5. 左移 `<<`
 | 
			
		||||
 | 
			
		||||
相当于乘以 $2^n$(但可能溢出):
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int a = 3;  // 0011₂
 | 
			
		||||
cout << (a << 2) << endl; // 1100₂ = 12
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 6. 右移 `>>`
 | 
			
		||||
 | 
			
		||||
相当于整除 $2^n$(但要区分有符号/无符号):
 | 
			
		||||
 | 
			
		||||
```cpp
 | 
			
		||||
int a = 12; // 1100₂
 | 
			
		||||
cout << (a >> 2) << endl; // 0011₂ = 3
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## ⚡ 补充:常见用途
 | 
			
		||||
 | 
			
		||||
1. **快速运算**:`x << 1` 相当于 `x * 2`,`x >> 1` 相当于 `x / 2`。
 | 
			
		||||
2. **掩码操作**:取某些位、清零某些位、设置某些位。
 | 
			
		||||
3. **集合表示**:一个整数的二进制位可以看作集合的元素是否存在。
 | 
			
		||||
4. **加密/压缩**:异或在流密码、校验和算法里很常见。
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
✅ **总结**
 | 
			
		||||
 | 
			
		||||
* C++ 提供了 `& | ^ ~ << >>` 六个主要位运算符。
 | 
			
		||||
* 它们直接操作二进制位,速度快、常用于底层优化。
 | 
			
		||||
* 常见技巧:掩码操作、快速乘除、集合运算、加密。
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
要不要我帮你写一个 **完整的小程序**,输入两个整数,输出它们的二进制表示,以及 `& | ^ ~ << >>` 的运算结果?这样能直观看清效果。
 | 
			
		||||
		Reference in New Issue
	
	Block a user