news 2026/6/15 11:31:30

分数取模的应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分数取模的应用

这是牛客寒假营第一场的A题,这是我第一次接触分数取模的题,从这里面学到了分数取模以及乘法逆元的相关知识。

我的整体思路就是定义两个数组p1和p2,其中p1中存放的是1-7个灯管亮的概率,p2中存放的是1-7个灯管不亮的概率。其中就用到了分数取模操作。其中用到了快速幂算法。接着在基于当前每个灯管亮的概率下,再去分别计算每个数字亮的概率,最后在将所有满足A + B = C的形式的 数的概率加起来就能得到最终的答案。我觉得难点主要是在分数取模这一步。

分数取模的具体解释如下:

具体代码如下:

#include <bits/stdc++.h> #define MOD 998244353 #define ll long long using namespace std; //a的b次方 ll qkm(ll a,ll b){ ll ans = 1; ll base = a; while (b){ if (b & 1){ ans = (ans * base) % MOD; } b >>= 1; base = (base * base) % MOD; } return ans; } void solve(){ ll c; cin>>c; //p1是1-7灯管亮的概率,p2是1-7灯管不良的概率 vector<ll> p1(8),p2(8); for (int i = 1;i <= 7;++i){ ll x; cin>>x; p1[i] = (x * qkm(100,MOD - 2)) % MOD; p2[i] = (1 - p1[i] + MOD) % MOD; // cout<<p1[i]<<" ! "<<p2[i]<<endl; } vector<ll> abc(10); vector<vector<ll>> num(10,vector<ll> (10));//每个数字亮的概率p num[0][1] = num[0][1] = num[0][2] = num[0][3] = num[0][5] = num[0][6] = num[0][7] = 1; num[1][3] = num[1][6] = 1; num[2][1] = num[2][3] = num[2][4] = num[2][5] = num[2][7] = 1; num[3][1] = num[3][3] = num[3][4] = num[3][6] = num[3][7] = 1; num[4][2] = num[4][3] = num[4][4] = num[4][6] = 1; num[5][1] = num[5][2] = num[5][4] = num[5][6] = num[5][7] = 1; num[6][1] = num[6][2] = num[6][4] = num[6][5] = num[6][6] = num[6][7] = 1; num[7][1] = num[7][3] = num[7][6] = 1; num[8][1] = num[8][2] = num[8][3] = num[8][4] = num[8][5] = num[8][6] = num[8][7] = 1; num[9][1] = num[9][2] = num[9][3] = num[9][4] = num[9][6] = num[9][7] = 1; for (int i = 0;i <= 9;++i){ ll ss = 1; for (int j = 1;j <= 7;++j){ if (num[i][j] == 1){ ss = (ss * p1[j]) % MOD; } else{ ss = (ss * p2[j]) % MOD; } } abc[i] = ss; } ll fz = 0; for (int i = 0;i <= c;++i){ ll sh = 1; ll g,s,b,q; g = i % 10; s = i % 100 / 10; b = i % 1000 / 100; q = i / 1000; sh = (sh * abc[g]) % MOD; sh = (sh * abc[s]) % MOD; sh = (sh * abc[b]) % MOD; sh = (sh * abc[q]) % MOD; g = (c - i) % 10; s = (c - i) % 100 / 10; b = (c - i) % 1000 / 100; q = (c - i) / 1000; sh = (sh * abc[g]) % MOD; sh = (sh * abc[s]) % MOD; sh = (sh * abc[b]) % MOD; sh = (sh * abc[q]) % MOD; if (fz == 0){ fz = sh; } else{ fz = (fz + sh) % MOD; } } cout<<fz<<endl; } int main() { int t; cin>>t; while (t--){ solve(); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 12:42:14

HCIP第一次作业

LSW1配置 vlan batch 2 3 interface GigabitEthernet 0/0/1 port link-type access port default vlan 2 interface GigabitEthernet 0/0/2 port link-type access port default vlan 3 interface GigabitEthernet 0/0/3 port link-type trunk port trunk allow-pass vl…

作者头像 李华
网站建设 2026/6/12 20:47:35

Anthropic大模型Agents构建全攻略:从理念到实践的极简指南

高效构建Agents的设计理念 始终贯穿“实用优先、简洁可控、按需适配”的逻辑。 1. 最小复杂度优先&#xff0c;拒绝过度设计 这是最核心的底层理念&#xff1a;构建LLM相关系统时&#xff0c;优先采用最简单的解决方案(如单次LLM调用检索/上下文示例)&#xff0c;仅在简单方…

作者头像 李华
网站建设 2026/6/10 23:18:23

JAVA理发预约系统,同城服务一键约起

以下是一个基于 JAVA 的同城理发预约系统解决方案&#xff0c;涵盖用户端、商家端、后台管理功能&#xff0c;支持“一键预约、智能匹配、实时通知”&#xff0c;助力快速搭建高效、便捷的本地生活服务平台。 一、系统核心功能 1. 用户端功能 一键预约 选择服务类型&#xff…

作者头像 李华
网站建设 2026/5/31 0:26:18

BXMya PM864AK01 3BSE018161R1 高性能冗余CPU模块

PM864AK01&#xff08;订货号&#xff1a;3BSE018161R1&#xff09;是瑞士ABB集团旗下AC 800M系列的高性能中央处理器&#xff08;CPU&#xff09;模块&#xff0c;是ABB Ability™ 800xA分布式控制系统&#xff08;DCS&#xff09;的核心控制组件。该产品专为大型、复杂且对可…

作者头像 李华
网站建设 2026/6/15 10:54:41

计算机网络经典问题透视:如何探知无线AP的SSID与BSSID?

前言&#xff1a;从连接Wi-Fi说起 在当今这个万物互联的时代&#xff0c;Wi-Fi已成为我们数字生活中不可或缺的“空气”。当我们打开手机或笔记本电脑&#xff0c;在琳琅满目的网络列表中选择一个熟悉的名字&#xff0c;输入密码&#xff0c;然后轻点连接——这个过程对大多数…

作者头像 李华