华丽丽的分割线

作者在2008年金融危机背景下毕业并踏入职场,在深圳亲身经历了房地产市场的波动及制造业的困境。从初入职场的刺猬般热情到面对资本力量的觉醒,再到平安集团从事运维工作期间的角色转变和技术跨越,这段经历不仅见证了个人成长,更反映了时代的变迁。

2008年金融危机的那年我毕业了,那年书摊上显眼的位置会摆着“次贷危机是什么”这类书籍,大多数人只知道美国发生了金融海啸,具体是什么鬼,国人感受不深, 随后几个月在深圳房价下降的带领下,新闻态度发生了变化,制造业破产的新闻变多,恐怖气氛笼罩着整个社会。 

我是在这种氛围中投入第一份工作,做一只快乐的热情洋溢的刺猬,“躲进小楼成一统,关他东夏与春秋”研究技术,优化项目的每个细微的进步,2年后负责的项目被卖了,也是梦醒时分, 真实感受到资本的力量可以凌驾一切技术之上。

华丽的分割线第一次发生, 分割线下是平安的生活。 

进入平安后做运维工作, 经历的太多。 生活上经历了为人夫为人父角色转变。 工作中的变化更大,进入多组织架构中,发现沟通合作比技术重要, 这对猿农来说,像是从农村突然进入大城市,除了眩晕,还是眩晕。 行业跨度180度的转变,以前的开发用的技术多数是无用武之地的,股票都没碰过的人,开始服务投资业务,一段时间里各种不适用比金融危机还恐怖,这一阶段非常感谢领导的容忍和鼓励, 否则很难坚持下来的。 在刻苦的弥补下,证券从业培训考试、老司机的带路、 总算适应了。 进入状态后, 发现平安像一部永不停止的机器, 使您根本停不下来 。 在这种状态下, 锻炼的机会根本也停不下来, 学习是飞快的。但时间长了会变成一个机器人,特定领域的机器人。 留给思考的时间很少,总结沉淀的时间不多。 

与此同时,随着岁月的流失,有一问号在脑中越来越大, 这么多年我在网络中、开源世界里一直都是索取的。  我能做点什么?为社会,为行业能做点什么?哪怕是微不足道的贡献?我都没有!

6年多时间里除了养家糊口,我没为网络留下任何贡献。  时间总能挤出来,经验或多或少总是有点, 缺少的是有个开始....




这个问题是一个**递推数列问题**,我们需要根据题目描述建立数学模型,并用 C 语言实现。 --- ### ✅ 题意解析 我们来逐句分析: - 第1天:zp 向 1 个女生表白 → 被拒绝 **1 次** - 第2天:他向 `m` 个女生表白 → 被拒绝 **m 次** - 从第3天开始: > 每天表白人数 = 前一天的次数 + 再前一天次数的两倍 即: $$ f(n) = f(n-1) + 2 \times f(n-2) $$ > 注意:题目问的是“他在第30天被拒绝了几次?” 但注意!第30天是**被接受的一天**,所以那天他仍然表白了,只是最后成功了。 因此,我们要输出的是——**第30天表白的人数(也就是被拒绝的人数,因为只追一个女生?)** 但是看样例输出非常大(如 `357913941`),而且递推规律和输入 m 相关。 再结合样例: ``` 输入 m=1, 输出 p=357913941 输入 m=2, 输出 p=536870912 输入 m=3, 输出 p=715827883 ``` 说明这个 `p` 是 **第30天当天的表白次数(即被拒次数)**,而整个序列由: - $ f(1) = 1 $ - $ f(2) = m $ - $ f(n) = f(n-1) + 2 \cdot f(n-2) $ 计算得到。 --- ### 🔢 数学建模 这是一个线性递推关系: $$ f(1) = 1,\quad f(2) = m \\ f(n) = f(n-1) + 2 \cdot f(n-2),\quad n \geq 3 $$ 我们要对每个测试样例求出 $ f(30) $ 的值。 但由于 $ f(30) $ 依赖于 $ f(2)=m $,我们可以将通解写成: $$ f(n) = A_n \cdot f(1) + B_n \cdot f(2) $$ 但实际上更简单的方法是预处理出两个基础序列: - 序列 a: 初始为 (1, 0),表示 f(1)=1, f(2)=0 → 得到贡献系数 A - 序列 b: 初始为 (0, 1),表示 f(1)=0, f(2)=1 → 得到贡献系数 B 然后对于任意 m,有: $$ f(30) = A_{30} \cdot 1 + B_{30} \cdot m $$ 但我们也可以直接模拟一遍递推即可(最多30步)。 --- ### ✅ 正确代码实现(使用 long long + 递推) ```c #include <stdio.h> int main() { int T; scanf("%d", &T); while (T--) { long long m; scanf("%lld", &m); // 初始化 f(1) 和 f(2) long long f_prev_prev = 1; // f(1) = 1 long long f_prev = m; // f(2) = m long long f_curr; // 递推计算 f(3) 到 f(30) for (int i = 3; i <= 30; i++) { f_curr = f_prev + 2 * f_prev_prev; // 更新前两项 f_prev_prev = f_prev; f_prev = f_curr; } // 输出第30天的表白次数(即被拒绝次数) printf("%lld\n", f_curr); } return 0; } ``` --- ### ✅ 样例验证 以 `m = 1` 为例: | n | f(n) | |--|-----| | 1 | 1 | | 2 | 1 | | 3 | 1 + 2×1 = 3 | | 4 | 3 + 2×1 = 5 | | 5 | 5 + 2×3 = 11 | | 6 | 11 + 2×5 = 21 | | ... | ... | 继续下去会发现增长很快。 运行程序后你会发现: - 当 `m=1` → 输出 `357913941` - `m=2` → `536870912` - `m=3` → `715827883` 完全匹配! --- ### 🔍 技术要点总结 | 点 | 说明 | |----|------| | 使用 `long long` | 因为结果超过 3e8,接近 1e9,必须用 long long | | 只需循环 28 次 | 从第3天到第30天 | | 不要用递归 | 会重复计算,效率低;迭代 O(n) 最佳 | | 输入输出格式 `%lld` | 题目明确要求 | --- ### ❓为什么不能用纯递归? 比如写成: ```c long long f(int n, int m) { if (n == 1) return 1; if (n == 2) return m; return f(n-1, m) + 2*f(n-2, m); } ``` 虽然逻辑正确,但没有记忆化时时间复杂度是指数级(类似斐波那契),`f(30)` 就可能需要上百万次调用,超时风险高。 迭代才是最优选择。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值