Solution - Codeforces 1957E Carousel of Combinations

news/2024/11/17 20:12:58/文章来源:https://www.cnblogs.com/rizynvu/p/18550983

首先这个 \(C(i, j)\bmod j\) 的形式就非常怪,于是首先肯定要先研究一下这个值。

先考虑如何求 \(C(i, j)\)
可以考虑先选出要用的 \(j\) 个数,再乘上其排列成环的方案数,那么有 \(C(i, j) = \binom{i}{j}\times (j - 1)!\)

那么就是来考虑 \(\binom{i}{j}\times (j - 1) ! \bmod j\) 的值了。
注意到后面的这个 \((j - 1)! \bmod j\) 是个定值,于是考虑分析这个值。

首先若 \(j\in \mathbb{P}\),根据威尔逊定理那么有 \((j - 1)!\bmod j = j - 1\)
否则若 \(j = 1\),显然为 \(0\)
接下来就考虑 \(j\) 为合数的情况了,感受一下会觉得其实这些值大部分都为 \(0\)
考虑令 \(j = x\times p^k\),那么 \((j - 1)!\bmod j \not = 0\) 就肯定要使得 \(k\ge x\times p^{k - 1}\not = 1\)\(= 1\) 就为质数了)。
那么就能发现只可能在取 \(x = 1, p = 2, k = 2\) 时有解,即 \(j = 4\) 时。

那么对于 \(j = 4\),显然是最特殊的,但是考虑到也只有这一种 \(j\),所以直接考虑直接预处理 \(\binom{i}{4}\times 6 \bmod 4\) 然后前缀和。

那么就只需要考虑 \(j\in \mathbb{P}\) 的情况了。
那么此时化简一下就有 \(\binom{i}{j}\times (j - 1)! \bmod j = \binom{i}{j}\times (j - 1)\bmod j = (j\binom{i}{j} - \binom{i}{j})\bmod j = (j - \binom{i}{j}\mod j)\mod j\)
于是问题来到如何求 \(\binom{i}{j}\bmod j\)
注意到此时 \(j\in \mathbb{P}\),那么就可以用 Lucas 定理了。
此时 \(\binom{i}{j}\bmod j = \binom{\lfloor\frac{i}{j}\rfloor}{\lfloor\frac{j}{j}\rfloor}\binom{i\bmod j}{j\bmod j} = \binom{\lfloor\frac{i}{j}\rfloor}{1}\binom{i\bmod j}{0} = \lfloor\frac{i}{j}\rfloor\times 1 = \lfloor\frac{i}{j}\rfloor\)
于是 \(C(i, j) = (j - \lfloor\frac{i}{j}\rfloor)\bmod j\)

注意到 \(x\in [kj, (k + 1)j)\) 都有 \(C(x, j) = (j - k\bmod j)\bmod j\),这说明实际上可以把这些 \(k\) 相同的 \(x\) 用差分来处理,就只需要对于每个 \(k\) 处理一次了。
那么这个 \(k\) 的上限就是 \(\lceil\frac{n}{j}\rceil\)
那么复杂度就是与埃氏筛相同的 \(\mathcal{O}(n\log \log n)\)

最后总时间复杂度 \(\mathcal{O}(n\log \log n + t)\)

#include<bits/stdc++.h>
constexpr int mod = 1e9 + 7;
constexpr int maxn = 1e6 + 10, N = 1e6;
int a[maxn], vis[maxn];
inline void init() {for (int i = 2; i <= N; i++) {if (vis[i]) continue;for (int j = 0, k = 0; j <= N; j += i, k = (i + k - 1) % i) {vis[j] = 1;(a[j] += k) %= mod, (a[std::min(N + 1, j + i)] += mod - k) %= mod;}}for (int i = 1; i <= N; i++) {(a[i] += a[i - 1]) %= mod;}for (int i = 1; i <= N; i++) {(a[i] += ((__int128_t)i * (i - 1) * (i - 2) * (i - 3) / 4) % 4) %= mod;}for (int i = 1; i <= N; i++) {(a[i] += a[i - 1]) %= mod;}
}
inline void solve() {int n;scanf("%d", &n);printf("%d\n", a[n]);
}
int main() {init();for (int T, _ = scanf("%d", &T); T--; ) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835501.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WINCC 7.5SP2下VBA创建变量组、变量1

今晚继续学习Wincc下面使用VBA创建变量分组,分组下创建多个变量。新浪审核有点慢,我在这里先发表了。 在变量管理中新建一个S7 连接,配置好连接参数,这个不能通过VBA创建。 打开wincc页面,在VBA编辑器下写下面的脚本:Sub addtags()Dim hmigo As hmigoDim strTagGroup As…

Scrum 冲刺博客-day7

一、每天会议 昨天完成的任务与今天计划完成任务成员 昨天已完成任务 今天计划完成任务董雯霖 个人中心页面 前端页面优化陈金星 后台管理页面 前端页面优化邱列圻 后端接口实现 后端接口开发测试李嘉远 后端接口实现 后端接口开发测试詹洛熙 各项页面测试 各项页面测试工作中遇…

Scrum 冲刺博客-day6

一、每天会议 昨天完成的任务与今天计划完成任务成员 昨天已完成任务 今天计划完成任务董雯霖 交流与反馈页面开发 个人中心页面陈金星 公告信息页面开发 后台管理页面邱列圻 debug 后端接口实现李嘉远 活动心得页面开发 后端口实现詹洛熙 首页页面测试、活动信息页面测试 各项…

团队项目冲刺第三天

课程 2024软件工程作业要求 团队作业4——项目冲刺作业目标 团队项目冲刺第三天团队会议合照燃尽图 当开启进度后,明显就比什么都不做纯聊的状态快多了,也积极多了,照这样下去说不定能提前完成计划表格成员 已完成 下一步洪吉潮 用户注册与登录功能完善设计登录界面交互 主题…

2024-2025-1 20241319 《计算机基础与程序设计》第八周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标 功能设计与面向对象设计 面向对象设计过程 面向对象语言三要素 汇编、编译、解释、执行作业正文 https://www.cnblogs…

团队项目冲刺第二天

课程 2024软件工程作业要求 团队作业4——项目冲刺作业目标 团队项目冲刺第二天团队会议合照燃尽图计划表格成员 已完成 下一步洪吉潮 用户注册与登录功能完善设计用户注册界面 用户注册与登录功能完善设计登录界面交互刘家辉 用户注册与登录功能完善实现邮箱注册功能及验证逻辑…

Scrum 冲刺博客-day5

一、每天会议 昨天完成的任务与今天计划完成任务成员 昨天已完成任务 今天计划完成任务董雯霖 活动信息页面 交流与反馈页面开发陈金星 首页页面 公告信息页面开发邱列圻 活动信息页面 debug李嘉远 活动信息页面 活动心得页面开发詹洛熙 配合测试 首页页面测试、活动信息页面测…

941. 有效的山脉数组

题目 自己写的 class Solution { public:bool validMountainArray(vector<int>& arr) {int l = 0, r = 1;bool up = true, change = false;if (arr.size() < 3)return false;if (arr[r] < arr[l])up = false;while (r < arr.size()){if (up){if (arr[r] <…

团队项目冲刺--Day4

每天举行站立式会议昨天已完成的工作成员 任务徐嘉炜 组织会议,说明项目进度,指导项目发展陈祥意 参与会议,简要讲述应用程序测试的各个模块林楦 参与会议,讲述有关功能界面的UI开发陈大锴 参与会议,协调开发技术与实际需求,记录需求蔡家显 参与会议,讲述测试时的注意事…

团队项目冲刺-day2

每天举行站立式会议 昨天已完成的工作成员 任务徐嘉炜 组织会议,说明项目进度,指导项目发展陈祥意 参与会议,简要讲述应用程序测试的各个模块林楦 参与会议,讲述有关功能界面的UI开发陈大锴 参与会议,协调开发技术与实际需求,记录需求蔡家显 参与会议,讲述测试时的注意事…

一文读懂maven

一、什么是mavenmaven是一个项目管理工具,通过pom.xml文件的配置获取jar包不用手动的去添加jar包就是在java项目和web项目上裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能,即通过pom.xml添加jar包 就…