[Agc028A]Two Abbreviations_数学

Two Abbreviations

题目链接https://atcoder.jp/contests/agc028/tasks/agc028_a

数据范围:略。


题解

题目中的位置非常不利于思考,我们令字符串的存储是从$0$开始。

也就是说$S$的第$i$个字符相当于$(i - 1)cdot frac{L}{N}$

手玩一下就会发现,题目中的$-1$,仅仅可能是两个串的字符应该出现在同一个位置,但是他俩不一样。

而且,如果没有这样的不满足的位置,$L=lcm(N,M)$即可,这是显然的,因为每个字符间隔都在成倍增长。

故此,暴力用$gcd$判一下即可。

代码

#include <bits/stdc++.h>

#define N 3000010 

using namespace std;

char s[N], t[N];

int main() {
    int n, m;
    cin >> n >> m ;
    scanf("%s%s", s + 1, t + 1);
    int d = __gcd(n, m);
    int n_ = n / d, m_ = m / d;
    for (int i = 0; i < d; i ++ ) {
        int k1 = i * n_ + 1, k2 = i * m_ + 1;
        if (s[k1] != t[k2]) {
            puts("-1");
            return 0;
        }
    }
    cout << (long long)n_ * m_ * d << endl ;
    return 0;
}
原文地址:https://www.cnblogs.com/ShuraK/p/11738359.html