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

NOIP2025模拟赛12(炼石计划NOIP模拟赛第 19 套题目)

写在前面:

我艹了何意味啊何意味T1放依托定理的板子题然后我还没听过这个定理(虽然据说是数论基础四大定理之一,但是好像学习数论基础的时候根本没看到过这个定理也没做过相关的题😡😡😡😡😡😡😡);T2发现像同余最短路,发现我不会同余最短路,企图上数据结构狂假不止,优化暴力未果于是最终交上去的是最低档的暴力(🤢🤢🤢🤢🤢🤢🤢);T3差点没读懂题,写了背包和背包,然后方案数狂挂不止,最终背包套暴搜(亏我想得出来)依旧低档暴力;T4最后十几分钟不知道用了什么手段交了一发 \(1pts\) 然后头结束又交一发变成 \(18pts\) ,没看懂。


T1 虫群之心

打表大法好哇!

Solve:

因为要求 \((n!)mod~p\) ,然后 \(n\) 范围 \(3e9\) 奇大无比,但是 \(p\) 一定是质数,于是通过威尔逊定理,当 \(p\) 为素数时:

\[(p-1)!≡-1(mod~p) \]

(证明可以看这个)

于是答案就是

\[\frac{(p-1)!}{∏_{i=m+1}^{p-1}}=∏_{i=m+1}^{p-2} i^{-1} \]

别骂了我对公式一窍不通qwq………

但是我赛时并不会威尔逊定理,但是我又发现我会打表,于是特判完无解后我点开了大样例………

数据奇大无比,我™的什么也没看出来。

注意到题面上给了 \(p-1000≤m≤3e9\) ,而且 \(p\) 保证为素数,于是肝硬化企图输入大样例找 \(p>m~and~min(p-m)\) 的数据,于是:

  • 大样例没有 \(p-m==1\) 的情况;

  • 大样例没有 \(p-m==2\) 的情况;

  • 大样例数据的第229、318、574个为 \(p-m==3\) ,然后把它们的 \([m,p]\) 的乘积、逆元、组合数………都输出一遍,发现有一个数对上了:竟然是 \(m+1\)\(p\) 意义下的乘法逆元!

  • 大样例数据的第758、563个为 \(p-m==4\) ,这次只输出逆元,暴力枚举相乘发现为 \((m_1)^{-1}·(m+2)^{-1}\)

  • 大样例数据的第186个为 \(p-m==5\) ,输出逆元暴力枚举相乘发现可能为 \(∏_{i=m+1}^{p-2} i^{-1}\)

  • 大样例没有 \(p-m==6\) 的情况😡😡😡😡😡😡😡;

· 大样例数据的第370个为 \(p-m==7\) ,输出逆元验证柿子发现真了。

于是写,然后写完了发现题面的小样例没过,于是特判 \(p==m+1\) 输出 \(m\)


Code:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int t;
long long m, mod;
inline long long ksm(long long a, long long b){long long as = 1;while(b){if(b & 1){as = (as * a) % mod;}b >>= 1;a = (a * a) % mod;}return as;
}
int main(){freopen("factorial.in", "r", stdin), freopen("factorial.out", "w", stdout);ios::sync_with_stdio(0), cin. tie(0), cout. tie(0);
cin >> t;
while(t --){cin >> m >> mod;if(mod <= m){cout << 0 << '\n';continue;}if(mod == m + 1){cout << m << '\n';continue;}else{long long ans = 1;for(long long i = mod - 2; i > m; i --){ans = (ans * ksm(i, mod - 2)) % mod;}cout << ans << '\n';}
}return 0;
}
/*差为3的有3个。
3
2013265918 2013265921
1004535806 1004535809
1000000004 1000000007*/
/*差为4的有2个。
2
1000000005 1000000009
998244349 998244353*/
/*差为5的有1个。
1
1000000004 1000000009*///没有差为6的。/*差为7的有1个。
1
2999999752 2999999759*/

T2 喝醉的兔子

不,你应该是《酒醉的蝴蝶》:

怎么也飞不出
花花的世界
原来我是一只
酒醉的蝴蝶
你的那一句誓约
来的轻描又淡写
却要换我这一生
再也解不开的结
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
怎么也飞不出
花花的世界
原来我是一只
酒醉的蝴蝶
你的那一句誓约
来的轻描又淡写
却要换我这一生
再也解不开的结
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
酒醉的蝴蝶

我不会。


T3 盲盒流水线

我这辈子都被盲盒毁了!


Solve:

我们有两种背包的操作可以做到复杂度 \(O(m)\):一种是往背包里加入一个元素,一种是询问两个背包合并后价格总和不超过某个定值的答案。

于是考虑二分,对于一段背包的区间 \([l, r]\),如果 \(l==r\) ,那么直接记录答案。

否则取中点 \(mid\) ,从 \(mid\) 往两边分别做前缀/后缀背包,那么此时每个过中
点的询问可以视为两个已处理出来的背包合并后询问价格总和不超过 \(m\) 的答案,可以直接 \(O(m)\) 解决。
那么此时没有过中点的询问,所以可以分治解决 \([l, m]\)\([m + 1, r]\)

最终复杂度 \(O(nm \log n + qm)\)

不能define int long long不然会像创世神一样全部爆炸。

强转要转全不然会像肝硬化一样 \(WA~49pts\)


Code:

#include <bits/stdc++.h>
using namespace std;
#define mid ((l + r) >> 1)
const int _ = 20010, __ = 100010, ___ = 510, mod = 998244353;
int n, q, v[_], w[_], l, r, m;
struct hhh{int l, r, m, n;
};
vector<hhh> c;
struct rain{int x;int n;
}mx[___], qian[_][___], hou[_][___], ans[__];
inline rain max(rain x, rain y){if(x. x != y. x){return x. x > y. x ? x : y;}return (rain){x. x, (x. n + y. n) % mod};
}
inline void solve(int l, int r){if(! c. size()){return ;}if(l == r){for(auto h : c){if(w[l] <= h. m){ans[h. n] = (rain){v[l], 1};}}return ;}vector<hhh> cun = c, o;c. clear();hou[mid + 1][0] = qian[mid][0] = (rain){0, 1};for(int i = 1; i <= 500; i ++){hou[mid + 1][i] = qian[mid][i] = (rain){- 999999999, 0};}for(int i = mid; i >= l; i --){for(int j = 0; j <= 500; j ++){hou[i][j] = hou[i + 1][j];if(j >= w[i]){hou[i][j] = max(hou[i][j], {hou[i + 1][j - w[i]]. x + v[i], hou[i + 1][j - w[i]]. n});}}}for(int i = mid + 1; i <= r; i ++){for(int j = 0; j <= 500; j ++){qian[i][j] = qian[i - 1][j];if(j >= w[i]){qian[i][j] = max(qian[i][j], {qian[i - 1][j - w[i]]. x + v[i], qian[i - 1][j - w[i]]. n});}}}while(cun. size()){hhh x = cun. back();cun. pop_back();if(x. r < mid){c. emplace_back(x);}else if(x. l > mid + 1){o. emplace_back(x);}else{rain s = {0, 0};mx[0] = hou[x. l][0];for(int j = 1; j <= x. m; j ++){mx[j] = max(mx[j - 1], hou[x. l][j]);}for(int j = 0; j <= x. m; j ++){s = max(s, (rain){mx[j]. x + qian[x. r][x. m - j]. x, (int)((long long)mx[j]. n * (long long)qian[x. r][x. m - j]. n % mod)});}ans[x. n] = s;}}solve(l, mid), c = o, o. clear();solve(mid + 1, r), c. clear();return ;
}
signed main(){freopen("knapsack.in","r",stdin);freopen("knapsack.out","w",stdout);ios::sync_with_stdio(0), cin. tie(0), cout. tie(0);cin >> n;for(int i = 1; i <= n; i ++){cin >> v[i] >> w[i];}cin >> q;for(int i = 1; i <= q; i ++){cin >> l >> r >> m;c. emplace_back((hhh){l, r, m, i});}solve(1, n);for(int i = 1; i <= q; i ++){if(! ans[i]. x){cout << "0 0\n";continue;}cout << ans[i]. x << ' ' << ans[i]. n << '\n';}return 0;
}

T4 失落的帝国

出题人找爸爸题,我不写。


END.

http://www.jsqmd.com/news/45962/

相关文章:

  • [nanoGPT] GPT模型架构 | `LayerNorm` | `CausalSelfAttention` |`MLP` | `Block` - 实践
  • duckdb索引介绍
  • 25.11.20 最长不升序列LNIS和最长升序列LIS
  • 周赛提高组(栈与队列)
  • 2025.11.20 B 题解
  • 重组干扰素蛋白的结构特点与分子性质综述
  • 2025 门窗十大品牌权威榜单:依托行业评估报告 + 选购白皮书,省心采购指南!
  • 实用指南:OpenCV下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了(附安装包)
  • 详解 DPO
  • 程序员手记
  • Object.entries() 和 Object.formEntries()的用法详解
  • 详细介绍:MyBatis 与 Spring Data JPA 核心对比:选型指南与最佳实践
  • 详细介绍:【从0开始学习Java | 第23篇】动态代理
  • 安卓中执行 root 命令
  • UniApp缓存系统详解 - 详解
  • FreeSWITCH使用mod_fail2ban模块来提升安全
  • 【ArcMap】使用拓扑(Topology)检查线是否存在断点
  • 电动汽车行业时序数据库选型指南:以 TDengine 为例的四大关键维度与评估标准
  • CF2165 VP 记录
  • 如何在SPM混编中实现不同target之间的通信?
  • Python在线教育广告精准投放:SEM结构方程、XGBoost、KDE核密度、聚类、因子分析、随机森林集成优化融合用户满意度渠道效能|附代码数据
  • 完整教程:Spring Boot Actuator全解析
  • 专题:2025年AI Agent智能体行业价值及应用分析报告:技术落地与风险治理|附140+ 份报告PDF、数据、可视化模板汇总下载
  • 2025/11/20-Why brushing teeth twice a day is not always best
  • uos安装idea
  • HDU3586-Information Disturbing
  • 【App Service】.NET 应用在App Service上内存无法占用100%的问题原因
  • 深入解析:css 的 clip-path 属性,绘制气泡
  • 快速构建一个基础、现代化的 WinForm 管理系统!
  • 国内外研究现状全面解析:掌握学术前沿的必备指南