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+{03} 的范围内的数,一定存在 4 4 4 的倍数,即 x x x 4 4 4 的模数,也就是输入的序列为 0 0 0 。因为 { 0 ∼ 3 } \\{0\\sim 3\\} {03} 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) xai(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) xai(modmi),可以直接用中国剩余定理得到一个解,这个解就是题目中想要求的一个解,我们判断一下这个解是否合法,并且答案要求的是最小的解,所以我们对于每一个解取 min ⁡ \\min min(如果当前解 v v v 不合法,那么就看下一个解 x + M x+M x+M 是否合法,以此类推)那么如何得到所有的可能的解呢?显然可以按照上面的思路,爆搜搜到 6 6 6 a i a_i ai ,然后 CRT 求一下解 v v vfor 循环判断一下是否与题中输入的字符串完全相同即可。

最后需要判断一下输入的 μ \\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)=5087=(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 信息解码

信息解码,ACM/ICPC World Finals 1991

2018 ACM-ICPC World Finals - Beijing