[Algorithm] Good Fibonacci

本文介绍了一种使用递归方法求解斐波那契数列的算法。通过定义一个函数good_fibonacci,该函数接受一个整数n作为参数,并返回斐波那契数列中第n个数及其前一个数。此算法巧妙地利用了递归特性,将复杂问题分解为更小的子问题进行求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def good_fibonacci(n):
	if n<=1:
		return (n,0)
	else:
		(a,b)=good_fibonacci(n-1)
		return (a+b,a)

转载于:https://www.cnblogs.com/chiyeung/p/9649877.html

#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> #include <array> using namespace std; const int MOD = 998244353; typedef long long ll; typedef unsigned long long ull; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); //freopen("y.in", "r", stdin); //freopen("y.out", "w", stdout); int n, m; ull s; cin>>n>>m>>s; vector<ull> l(n), r(n); for (int i = 0; i < n; i++) { cin >> l[i] >> r[i]; } int n1 = (n + 1) / 2; int n2 = n - n1; ull initial_state = 0; for (int i = 0; i < n; i++) { initial_state |= (3ULL << (2 * i)); } unordered_map<ull, ll> dp; dp[initial_state] = 1; for (int bit = m - 1; bit >= 0; bit--) { unordered_map<ull, ll> new_dp; ull target_bit = (s >> bit) & 1; for (const auto& [state, count_val] : dp) { ull mask_group1 = (1ULL << (2 * n1)) - 1; ull state_group1 = state & mask_group1; ull state_group2 = state >> (2 * n1); unordered_map<ull, array<ll, 2>> count_map1; for (int assign = 0; assign < (1 << n1); assign++) { ull new_state_group1 = 0; int xor_val = 0; bool valid = true; for (int i = 0; i < n1; i++) { int d = (assign >> i) & 1; int global_i = i; int st = (state_group1 >> (2 * i)) & 3; int lb = (l[global_i] >> bit) & 1; int rb = (r[global_i] >> bit) & 1; if (st == 0) { new_state_group1 |= (0ULL << (2 * i)); xor_val ^= d; } else if (st == 1) { if (d < lb) { valid = false; break; } if (d == lb) { new_state_group1 |= (1ULL << (2 * i)); } else { new_state_group1 |= (0ULL << (2 * i)); } xor_val ^= d; } else if (st == 2) { if (d > rb) { valid = false; break; } if (d == rb) { new_state_group1 |= (2ULL << (2 * i)); } else { new_state_group1 |= (0ULL << (2 * i)); } xor_val ^= d; } else if (st == 3) { if (d < lb || d > rb) { valid = false; break; } if (lb == rb) { new_state_group1 |= (3ULL << (2 * i)); } else { if (d == lb) { new_state_group1 |= (1ULL << (2 * i)); } else { new_state_group1 |= (2ULL << (2 * i)); } } xor_val ^= d; } } if (valid) { count_map1[new_state_group1][xor_val] = (count_map1[new_state_group1][xor_val] + 1) % MOD; } } unordered_map<ull, array<ll, 2>> count_map2; for (int assign = 0; assign < (1 << n2); assign++) { ull new_state_group2 = 0; int xor_val = 0; bool valid = true; for (int i = 0; i < n2; i++) { int d = (assign >> i) & 1; int global_i = n1 + i; int st = (state_group2 >> (2 * i)) & 3; int lb = (l[global_i] >> bit) & 1; int rb = (r[global_i] >> bit) & 1; if (st == 0) { new_state_group2 |= (0ULL << (2 * i)); xor_val ^= d; } else if (st == 1) { if (d < lb) { valid = false; break; } if (d == lb) { new_state_group2 |= (1ULL << (2 * i)); } else { new_state_group2 |= (0ULL << (2 * i)); } xor_val ^= d; } else if (st == 2) { if (d > rb) { valid = false; break; } if (d == rb) { new_state_group2 |= (2ULL << (2 * i)); } else { new_state_group2 |= (0ULL << (2 * i)); } xor_val ^= d; } else if (st == 3) { if (d < lb || d > rb) { valid = false; break; } if (lb == rb) { new_state_group2 |= (3ULL << (2 * i)); } else { if (d == lb) { new_state_group2 |= (1ULL << (2 * i)); } else { new_state_group2 |= (2ULL << (2 * i)); } } xor_val ^= d; } } if (valid) { count_map2[new_state_group2][xor_val] = (count_map2[new_state_group2][xor_val] + 1) % MOD; } } for (const auto& [ns1, arr1] : count_map1) { for (const auto& [ns2, arr2] : count_map2) { ll ways = 0; if (target_bit == 0) { ways = (arr1[0] * arr2[0] % MOD + arr1[1] * arr2[1] % MOD) % MOD; } else { ways = (arr1[0] * arr2[1] % MOD + arr1[1] * arr2[0] % MOD) % MOD; } if (ways == 0) continue; ull new_state = ns1 | (ns2 << (2 * n1)); new_dp[new_state] = (new_dp[new_state] + count_val * ways) % MOD; } } } dp = move(new_dp); if (dp.empty()) break; } ll ans = 0; for (const auto& [state, count_val] : dp) { ans = (ans + count_val) % MOD; } cout << ans << endl; return 0; }优化代码时间 并生成
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值