NC23413 小A买彩票
题目
题目描述
小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富。已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的。现在小A连续购买了n张彩票,他希望你能够告诉他至少能够不亏本的概率是多少。
输入描述
一行一个整数N,为小A购买的彩票数量一行一个整数N,为小A购买的彩票数量一行一个整数N,为小A购买的彩票数量
输出描述
输出一个最简分数a/b,表示小A不亏本的概率。若概率为1,则输出1/1,概率为0,则输出0/1。输出一个最简分数a/b,表示小A不亏本的概率。
若概率为1,则输出1/1,概率为0,则输出0/1。输出一个最简分数a/b,表示小A不亏本的概率。若概率为1,则输出1/1,概率为0,则输出0/1。
示例1
输入
2
输出
3/8
备注
题解
知识点:线性dp。
设 表示第 次获得 元的概率。因为要输出分数,老样子先乘上个基数,这里取 比较合适,因为最多 次都除 。
注意边界条件, 的范围是 。每次至少得到 元,因此上一轮总金额 至少大于等于 。
转移方程:
考虑优化空间,由于转移只和上一层有关,可以考虑压缩成一维。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> #define ll long long using namespace std; ll dp[127]; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; ll base = 1LL << (2 * n); dp[0] = base; for (int i = 1;i <= n;i++) { for (int j = 4 * i;j >= i;j--) { dp[j] = 0;///因为是累加莫忘初始化 for (int k = 1;k <= 4;k++) if (j - k >= i - 1) dp[j] += dp[j - k] / 4;///大于等于i因为上一层最小是i-1 } } ll ans = 0; for (int i = 3 * n;i <= 4 * n;i++) ans += dp[i]; ll d = gcd(ans, base); cout << ans / d << '/' << base / d << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16573359.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效