【中国剩余定理】【技巧】codeforces102056C Heretical … Möbius

Rikka was walking around the school building curiously until a strange room with a door number of 404 caught her eyes.

It seemed like a computer room — there were dozens of computers lying orderly, but papers, pens, and whiteboards everywhere built up a nervous atmosphere. Suddenly, Rikka found some mysterious codes displayed on a computer which seemed to have nothing different from others — is this a message from inner world?

Excited Rikka started her exploration. The message was generated by a program named for_patterns_in_mobius which outputted a string s of length 109, containing the value of |μ(x)| for x=1,2,…,109 in order.

Suddenly, Rikka heard footsteps outside. She quickly took a screenshot and left. The screenshot recorded a string t of length 200, perhaps a substring of s. Now Rikka wonders if it is really a substring of s, and if so, where it first appears in s.

Could you help her to decipher the codes?

Input
There are 10 lines in total. Each line contains 20 characters, each of which is either “0” or “1”. t is the concatenation of them — the result of concatenating them in order.

Output
Output a single integer in the only line. If t is a substring of s, output the first position it appears in s, that is, the minimum positive integer p such that all the digits |μ(p+i)| for i=0,1,…,199 form the string t. Otherwise output −1.


 出自今天EC-final的模拟。花在这题上不少时间,主要还是被卡常了。
 首先这个莫比乌斯函数的绝对值,显然如果是0,就意味着有平方因子,否则就没有。单纯枚举当然不行。注意到因为4的倍数一定是0,9的倍数一定是0……169的倍数一定是0,那么我们可以对4,9,25,49,121,169这6个200以内这质数平方进行考虑,求出起点位置对于每个数的模数可能是多少,然后进行枚举,用中国剩余定理求出可能的解。但是这些可能的解的数量很多该怎么办?事实上,经过直觉和程序检查,发现0的个数不会超过93个,那么超过93个直接输出-1就行了。剩余情况的话模数的可能性是不会很多的。
 最后对可能答案的200个数进行一一检查。一开始被卡常数了。主要是检查一个数是否有平方因子,我只能想到sqrt(x)sqrt(x)sqrt(x)的做法,这样会超时。急中生智,我把拥有比较大的平方因子的数先筛出来,放进一个set,这样的话每次检查一个数x,先枚举小的平方因子,再在set里查找,效率就大大提升了。

#include<cstdio>
#include<vector>
#include<set>
using namespace std;
using LL=long long;

const int sz=160;  //sz代表暴力枚举上限
const int m[6]={
   
   4,9,25,49,121,169};
const int p[169]={
   
   2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,
					53,59,61,67,71,73,79,83,89,97,
					101,103,107,109,113,127,131,137,139,149,
					151,157,163,167,173,179,181
<think>好的,用户现在在Codeforces平台上查找与中国剩余定理相关的题目或解决方案。我需要根据用户提供的引用内容以及之前的回答来提供帮助。首先,回顾之前的对话,用户已经得到了一些关于中国剩余定理(CRT)的示例题目和C++代码,以及相关问题。现在用户进一步询问具体的题目和解法,可能需要更详细的题目链接、分类或具体解题思路。 用户提供的引用中有几个代码示例和问题描述,例如HDOJ 1788、Codeforces 710D等。我需要将这些内容整合起来,给出用户在Codeforces上可能遇到的CRT相关题目类型和解决方法。注意用户可能需要题目编号、难度、关键解法步骤,以及如何应用扩展中国剩余定理(exCRT)等。 首先,确定用户的需求是查找Codeforces上的CRT题目和解法。需要确认用户是否了解CRT的基本原理,或者是否需要先复习理论。根据之前的回答,用户可能已经有一定基础,现在需要具体应用。 接下来,分析用户提供的引用内容。引用[1]是关于HDOJ的一道题,但用户主要关注Codeforces,所以可能不需要深入讨论。引用[3]提到Codeforces 710D,使用扩展CRT,这应该是重点。引用[2]和[4]涉及其他数论问题,可能与CRT关联不大,但需要判断是否有间接联系。 用户可能需要知道Codeforces上哪些题目明确使用CRT或exCRT,比如Div2的某些题目。例如,710D题目需要解两个线性同余方程,并计算区间内的解的数量,这正是exCRT的应用场景。此外,可能还有其他题目,比如涉及模运算或同余方程组的问题。 然后,需要组织信息,将题目按难度分类,给出题目链接、关键解法和注意事项。同时,可能需要解释exCRT与标准CRT的区别,以及如何处理模数不互质的情况。 另外,用户可能希望了解如何识别题目是否适用CRT,例如当题目要求找到满足多个同余条件的最小解时,或者当模数不互质时需要扩展CRT。 最后,确保回答结构清晰,包括题目列表、解法要点、代码示例(如果有)以及相关练习建议。同时,生成相关问题,帮助用户进一步学习。</think>### Codeforces中国剩余定理相关题目及解法指南 --- #### **一、经典题目分类与解法** 以下题目均涉及中国剩余定理(CRT)或其扩展形式(exCRT),按难度排序: --- ##### **1. Codeforces 710D: Two Arithmetic Progressions (难度:2000)** **题目链接**: [710D](https://codeforces.com/contest/710/problem/D) **题意** 求区间 $[L, R]$ 内满足以下两个同余式的整数 $x$ 的数量: $$ \begin{cases} x \equiv a_1 \ (\text{mod} \ b_1) \\ x \equiv a_2 \ (\text{mod} \ b_2) \end{cases} $$ **解法要点** 1. **扩展中国剩余定理(exCRT)**:当模数 $b_1, b_2$ 不互质时,需合并两个同余式为单一方程。 2. **合并条件**:若合并后的方程无解,则答案为 $0$;否则计算解在区间内的分布[^3]。 3. **数学公式**: - 合并后的通解为 $x \equiv c \ (\text{mod} \ M)$,其中 $M = \text{lcm}(b_1, b_2)$。 - 区间内解的个数为 $\left\lfloor \frac{R - c}{M} \right\rfloor - \left\lfloor \frac{L - 1 - c}{M} \right\rfloor$。 **代码片段** ```cpp // 合并两个同余式 x ≡ a1 mod m1 和 x ≡ a2 mod m2 pair<long long, long long> merge(long long a1, long long m1, long long a2, long long m2) { long long g = gcd(m1, m2); if ((a2 - a1) % g != 0) return {-1, -1}; // 无解 long long lcm = m1 / g * m2; long long k = (a2 - a1) / g; long long x = (a1 + (k * inv(m1/g, m2/g)) % (m2/g) * m1) % lcm; return {x, lcm}; } ``` --- ##### **2. Codeforces 687B: Remainders Game (难度:1900)** **题目链接**: [687B](https://codeforces.com/contest/687/problem/B) **题意** 给定 $x \mod c_1, x \mod c_2, \dots, x \mod c_n$,判断是否能唯一确定 $x \mod k$。 **解法要点** 1. **CRT的核心条件**:若所有 $c_i$ 的最小公倍数 $\text{lcm}(c_1, c_2, \dots, c_n)$ 是 $k$ 的倍数,则可以唯一确定 $x \mod k$[^1]。 2. **直接计算**:计算 $\text{lcm}(c_1, c_2, \dots, c_n)$,检查是否 $\text{lcm} \mod k == 0$。 **代码逻辑** ```cpp long long lcm_all = 1; for (int ci : c) { lcm_all = lcm(lcm_all, ci); if (lcm_all > 1e12) break; // 防止溢出 } cout << (k % lcm_all == 0 ? "Yes" : "No") << endl; ``` --- ##### **3. Codeforces 1153C: Serval and Parenthesis Sequence (难度:1800)** **间接应用** 通过构造合法括号序列,隐含利用模运算平衡左右括号数量。需保证前缀和满足特定条件,类似同余约束[^4]。 --- #### **二、扩展中国剩余定理(exCRT)核心步骤** 当模数 **不互质** 时,标准CRT失效,需使用扩展方法: 1. **合并两个同余方程**: $$ \begin{cases} x \equiv a_1 \ (\text{mod} \ m_1) \\ x \equiv a_2 \ (\text{mod} \ m_2) \end{cases} $$ - 解方程 $a_1 + k_1 m_1 = a_2 + k_2 m_2$,即 $k_1 m_1 - k_2 m_2 = a_2 - a_1$。 - 使用扩展欧几里得算法求 $k_1, k_2$,若 $\gcd(m_1, m_2) \nmid (a_2 - a_1)$,则无解。 2. **递归合并**:将合并后的方程与下一个同余式继续合并,直至所有方程处理完毕。 --- #### **三、练习题目推荐** | 题目编号 | 难度 | 核心考点 | 链接 | |----------|------|----------|------| | **710D** | 2000 | exCRT与区间计数 | [Link](https://codeforces.com/contest/710/problem/D) | | **687B** | 1900 | CRT的存在性判定 | [Link](https://codeforces.com/contest/687/problem/B) | | **338D** | 2400 | exCRT与矩阵应用 | [Link](https://codeforces.com/problemset/problem/338/D) | --- #### **四、常见错误与调试技巧** 1. **溢出问题**:计算过程中需使用 `long long` 并随时取模。 2. **模数非互质**:忘记检查 $\gcd(m_i, m_j)$ 是否整除 $(a_j - a_i)$。 3. **区间端点处理**:计算区间内解的数量时,需注意边界条件(如 $x \geq L$ 且 $x \leq R$)。 --- #### **相关问题** 1. 如何判断两个同余方程是否可合并? 2. 扩展欧几里得算法在exCRT中如何具体应用? 3. 当模数极大时,如何优化CRT的计算过程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值