2019 ICPC EC Finals C. Heretical … Möbius(中国剩余定理,序列检验)
Posted 繁凡さん
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 ICPC EC Finals C. Heretical … Möbius(中国剩余定理,序列检验)相关的知识,希望对你有一定的参考价值。
整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
2018 ICPC EC Finals C. Heretical … Möbius
Weblink
https://codeforces.com/gym/102056/problem/C
Problem
给定长度为 200 200 200 的 01 01 01 序列 ∣ μ ( i ) ∣ |\\ \\mu(i)\\ | ∣ μ(i) ∣,找到符合的最小的起点 x x x,即 ∣ μ ( x ) ∣ ∼ ∣ μ ( x + 199 ) ∣ |\\ \\mu(x)\\ |\\sim |\\ \\mu(x+199)\\ | ∣ μ(x) ∣∼∣ μ(x+199) ∣ 要求完全的给定的序列对照一致。
Solution
由于给定的是绝对值的 01 01 01 串,所以只有 μ ( i ) = 0 \\mu(i)=0 μ(i)=0 有用,所以从这里出发考虑。
我们知道 μ ( x ) = 0 \\mu(x)=0 μ(x)=0 则 x x x 一定含有因子 p 2 p^2 p2,而序列长度仅为 200 200 200 ,这好像在提示着我们些什么。我们知道 200 200 200 以内的因子 p 2 p^2 p2 一共就只有 6 6 6 个,即: 4 , 9 , 25 , 49 , 121 , 169 4,9,25,49,121,169 4,9,25,49,121,169。也就是说在一个长度为 200 200 200 的连续自然数序列里,所有 μ ( i ) = 0 \\mu(i)=0 μ(i)=0 的数,一定至少存在这 6 6 6 个 p 2 p^2 p2 因子。所以就有了思路:
对于一个正确合法的起点
x
x
x ,在
x
+
{
0
∼
3
}
x+\\{0\\sim 3\\}
x+{0∼3} 的范围内的数,一定存在
4
4
4 的倍数,即
x
x
x 模
4
4
4 的模数,也就是输入的序列为
0
0
0 。因为
{
0
∼
3
}
\\{0\\sim 3\\}
{0∼3} 是
4
4
4 的简化剩余系,同理,对于其他的
5
5
5 个
p
2
p^2
p2 因子同样成立。我们设
m
=
{
4
,
9
,
25
,
49
,
121
,
169
}
m=\\{4,9,25,49,121,169\\}
m={4,9,25,49,121,169},也就意味着我们就可以枚举每个因子的简化剩余系,一定能找到一个数
y
=
x
+
a
i
y=x+a_i
y=x+ai,是
m
i
m_i
mi 的倍数,即含有
m
i
m_i
mi 这个
p
2
p^2
p2 因子,即
x
≡
a
i
(
m
o
d
m
i
)
x\\equiv a_i(\\mod m_i)
x≡ai(modmi) 。至于如何判断枚举到的
i
i
i 是否合法,我们可以枚举一下
a
i
+
k
i
×
m
i
a_i+k_i\\times m_i
ai+ki×mi 看该位置的字符串是否为
0
0
0 。这样我们就得到了 6 个同余方程
x
≡
a
i
(
m
o
d
m
i
)
x\\equiv a_i(\\mod m_i)
x≡ai(modmi),可以直接用中国剩余定理得到一个解,这个解就是题目中想要求的一个解,我们判断一下这个解是否合法,并且答案要求的是最小的解,所以我们对于每一个解取
min
\\min
min(如果当前解
v
v
v 不合法,那么就看下一个解
x
+
M
x+M
x+M 是否合法,以此类推)那么如何得到所有的可能的解呢?显然可以按照上面的思路,爆搜搜到
6
6
6 个
a
i
a_i
ai ,然后 CRT 求一下解
v
v
v ,for
循环判断一下是否与题中输入的字符串完全相同即可。
最后需要判断一下输入的 μ \\mu μ 序列是否合法,也就是 ( 200 4 ) = 50 ∼ 87 = ( 200 4 = 50 + 200 9 = 22 + 200 25 = 8 + 200 49 = 4 + 200 121 = 2 + 200 169 = 1 ) (\\cfrac{200}{4})=50\\sim 87=(\\cfrac{200}{4}=50 + \\cfrac{200}{9}=22 + \\cfrac{200}{25}=8 + \\cfrac{200}{49}=4 + \\cfrac{200}{121}=2 + \\cfrac{200}{169}=1 ) (4200)=50∼87=(4200=50+9200=22+25200=8+49200=4+121200=2+169200=1) ,不然会 T 的很惨 …
Code
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 600007, INF = 0x3f3f3f3f;
const double eps = 1e-8;
typedef int itn;
int t, n;
ll M = 1;
string str = " ";
string s;
int m[] = {0, 4, 9, 25, 49, 121, 169};
int cnt, primes[N];
//50 22 8 4 2 1 = 87
int a[N];
int ans = INF;
bool vis[N];
void init(int n)
{
for(int i = 2; i <= n; ++ i) {
if(vis[i] == 0) primes[ ++ cnt] = i;
for(int j = 1; j <= cnt && i * primes[j] <= n; ++ j) {
vis[i * primes[j]] = true;
if(i % primes[j] == 0) break;
}
}
}
inline int exgcd(itn a, int b, int& x, int& y)
{
if(b == 0) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
int z = x;
x = y;
y = z - y * (a / b);
return d;
}
int CRT()
{
int res = 0;
int x, y, GCD;
for(int i = 1; i <= 6; ++ i) {
int Mi = M / m[i];
int d = exgcd(Mi, m[i], x, y);
x = (x % m[i] + m[i]) % m[i];
res = (res + 1ll * Mi * a[i] * x) % M;
}
return (res + M) % M;
}
int mu(int v)
{
for(int i = 1; i <= cnt && primes[i] * primes[i] <= v; ++ i) {
if(v % (primes[i] * primes[i]) == 0)
return 0;
}
return 1以上是关于2019 ICPC EC Finals C. Heretical … Möbius(中国剩余定理,序列检验)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1089K - King Kog's Reception - [线段树][2018-2019 ICPC, NEERC, Northern Eurasia Finals P
2016 ICPC World Finals -Ceiling Function
2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path
[UVa 213]Message Decoding,ACM/ICPC World Finals 1991 信息解码