当前位置: 首页 > news >正文

牛客周赛 Round 60(思维、逆元、组合数、概率DP)

文章目录

  • 牛客周赛 Round 60(思维、逆元、组合数、概率DP)
    • A. 困难数学题
    • B. 构造序列
    • C. 连点成线
    • D. 我们N个真是太厉害了(思维)
    • E. 折返跑(小费马定理求逆元、组合数)
    • F. 口吃(概率DP)

牛客周赛 Round 60(思维、逆元、组合数、概率DP)


F题,概率DP不会,学了再补


A. 困难数学题

  • x ^ x = 0
  • 0 ^ x = x
  • ^ 表示二进制异或
#include<bits/stdc++.h>using namespace std;int main(){cout << 0 << endl;return 0;
}

B. 构造序列

注意是ABAB,还是ABABA

#include<bits/stdc++.h>
#define ll long long
using namespace std;int main(){ll a, b;cin >> a >> b;cout << min(a, b) * 2 + (a != b) << endl;return 0;
}

C. 连点成线

统计每行每列出现的最大值和最小值,做差取max即可,

#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 5;vector<int> row[maxn], column[maxn];int main(){int n, m;cin >> n >> m;for(int i = 1; i <= m; i++){int x, y;cin >> x >> y;row[x].push_back(y);column[y].push_back(x);}int res = 0;for(int i = 1; i <= n; i++){if(row[i].size() > 1){sort(row[i].begin(), row[i].end());res = max(res, *(row[i].end() - 1) - row[i][0]);	// row[i].end() 是指针,表示row[i]最后一个元素的后一位的地址}if(column[i].size() > 1){sort(column[i].begin(), column[i].end());res = max(res, *(column[i].end() - 1) - column[i][0]);}}cout << res << endl;return 0;
}

D. 我们N个真是太厉害了(思维)

如果当前序列 A,任选元素加和,可以构成出排列 1、2、3、…、mx。

向序列A中加入元素 x 后,如果 x <= mx +1,这时可以构成的排列变为 1、2、3、…、mx、mx+1、…、mx + x。

根据题意,对a排序,依次遍历,不断维护mx,并判断 a[i] 是否小于等于 mx+1。如出现 a[i] > mx+1,则 mx+1 为第一个不能被加和得到的数。

#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 5;int a[maxn];int main(){int ncase;cin >> ncase;while(ncase--){int n;cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];sort(a+1, a+1+n);int res = -1;if(a[1] != 1) res = 1;else{int mx = 1;for(int i = 2; i <= n; i++){if(a[i] <= mx + 1) mx += a[i];else{res = mx + 1;break;}if(mx >= n) break; // 一点点优化}}if(res == -1) cout << "Cool!" << endl;else cout << res << endl;}return 0;
}

E. 折返跑(小费马定理求逆元、组合数)

对于一次查询 n 和 m,可以理解为在 n-2 个点中选 m - 1 个点出来,选择的方案数即为结果。(n-2:去除掉开始和结尾)

综上: r e s = C n − 2 m − 1 res = C_{n-2}^{m-1} res=Cn2m1

用小费马定理求逆元计算组合数即可。
PS:第一眼以为是DP,稍微写一下状态转移方程,就可以发现是组合数。

#include<bits/stdc++.h>
#define ll long long
using namespace std;const ll mod = 1e9 + 7;
const int maxn = 1e6 + 5;ll qpow(ll a, ll b){ll res = 1;while(b){if(b & 1) res = res * a % mod;a *= a;a %= mod;b >>= 1;}return res;
}ll f[maxn], p[maxn];
ll C(ll a, ll b){return f[a] * p[b] % mod * p[a-b] % mod;
}int main(){f[0] = 1;for(int i = 1; i < maxn; i++) f[i] = f[i-1] * i % mod;for(int i = 0; i < maxn; i++) p[i] = qpow(f[i], mod-2); // 费马小定理求逆元int ncase;cin >> ncase;while(ncase--){ll n, m;cin >> n >> m;n -= 2; m -= 1;if(n <= 0 || m <= 0) cout << 1 << endl;else cout << C(n, m) << endl;}return 0;
}

F. 口吃(概率DP)

先挖坑。

#include<bits/stdc++.h>
#define ll long long
using namespace std;const ll mod = 1e9 + 7;
const int maxn = 1e5 + 5;
ll a[maxn], b[maxn];ll qpow(ll a, ll b){ll res = 1;while(b){if(b & 1) res *= a;res %= mod;a *= a;a %= mod;b >>= 1;}return res;
}int main(){int n;cin >> n;for(int i = 1; i < n; i++) cin >> a[i];for(int i = 1; i < n; i++) cin >> b[i];ll num = 1 + b[1] * qpow(a[1], mod-2) % mod;ll res = num;for(int i = 2; i < n; i++){num = (a[i] + b[i]) * (a[i] + b[i]) % mod + num * b[i] % mod * b[i] % mod;num = num * qpow(a[i], mod-2) % mod * qpow(a[i], mod-2) % mod;res = (res + num) % mod;}cout << (res + 1) % mod << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解
  • 【iOS】单例模式
  • 基于python+django+vue的图书管理系统
  • 传输层协议 —— TCP协议(上篇)
  • 学习Java(一)类和对象
  • 安卓开发,如何实现apk的代码混淆、日志混淆?
  • 音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现
  • 【d46】【Java】【力扣】234.回文链表
  • 详解QT元对象系统用法
  • RK3568部署DOCKER启动服务器失败解决办法
  • 实用小工具——多标签页插件Office Tab介绍
  • C++ 解析 RDP 协议
  • 分布式Redis(14)哈希槽
  • 数据可视化pyecharts——数据分析(柱状图、折线图、饼图)
  • 【算法——双指针】
  • 03Go 类型总结
  • express.js的介绍及使用
  • JSONP原理
  • MQ框架的比较
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 爱情 北京女病人
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 两列自适应布局方案整理
  • 容器服务kubernetes弹性伸缩高级用法
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​业务双活的数据切换思路设计(下)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (差分)胡桃爱原石
  • (二)windows配置JDK环境
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)基于IDEA的JAVA基础12
  • (转)Linux整合apache和tomcat构建Web服务器
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net core控制台应用程序初识
  • .NET gRPC 和RESTful简单对比
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 快速重构概要1
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET简谈设计模式之(单件模式)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net通过类组装数据转换为json并且传递给对方接口
  • @selector(..)警告提示
  • @拔赤:Web前端开发十日谈