题解 | #GCD Table#

GCD Table

https://ac.nowcoder.com/acm/contest/21289/H

【GCD Table】 若选中的起始位置为(i,j)(i,j)(i,j)​,则:

<mstyle displaystyle="false" scriptlevel="0">{<mstyle displaystyle="false" scriptlevel="0">gcd(i,j))</mstyle><mstyle displaystyle="false" scriptlevel="0">=</mstyle><mstyle displaystyle="false" scriptlevel="0">a1</mstyle><mstyle displaystyle="false" scriptlevel="0">gcd(i,j+1))</mstyle><mstyle displaystyle="false" scriptlevel="0">=</mstyle><mstyle displaystyle="false" scriptlevel="0">a2</mstyle><mstyle displaystyle="false" scriptlevel="0">gcd(i,j+2))</mstyle><mstyle displaystyle="false" scriptlevel="0">=</mstyle><mstyle displaystyle="false" scriptlevel="0">a3</mstyle></mstyle><mstyle displaystyle="false" scriptlevel="0"></mstyle><mstyle displaystyle="false" scriptlevel="0">{<mstyle displaystyle="false" scriptlevel="0">j</mstyle><mstyle displaystyle="false" scriptlevel="0"></mstyle><mstyle displaystyle="false" scriptlevel="0">0(mod<mtext> </mtext><mtext> </mtext>a1)</mstyle><mstyle displaystyle="false" scriptlevel="0">j</mstyle><mstyle displaystyle="false" scriptlevel="0"></mstyle><mstyle displaystyle="false" scriptlevel="0">1(mod<mtext> </mtext><mtext> </mtext>a2)</mstyle><mstyle displaystyle="false" scriptlevel="0">j</mstyle><mstyle displaystyle="false" scriptlevel="0"></mstyle><mstyle displaystyle="false" scriptlevel="0">2(mod<mtext> </mtext><mtext> </mtext>a3)</mstyle></mstyle>\begin{matrix} \left\{\begin{matrix} gcd(i,j)) &=& a_1 \\ gcd(i,j+1)) &=& a_2 \\ gcd(i,j+2)) &=& a_3 \end{matrix}\right. & \Leftrightarrow & \left\{\begin{matrix} j &\equiv& 0(\mod a_1) \\ j &\equiv& -1 (\mod a_2) \\ j &\equiv& -2 (\mod a_3) \end{matrix}\right. \end{matrix}gcd(i,j))gcd(i,j+1))gcd(i,j+2))===a1a2a3jjj0(moda1)1(moda2)2(moda3)

上式可以通过excrt求得jjj​​​​​的通解:j=j0+Mx,<mtext> </mtext>M=lcm(a1,a2...ak)j=j_0+M\cdot x,\ M=lcm(a_1,a_2...a_k)j=j0+Mx, M=lcm(a1,a2...ak)​​​,且iii​​​​​​​​​是MMM​​​​​​​​​​​的倍数,i=M+Myi=M+M\cdot yi=M+My

g=gcd(M,j0)g=gcd(M,j_0)g=gcd(M,j0)​,g=gcd(M+My,j0+Mx)g'=gcd(M+M\cdot y,j_0+M\cdot x)g=gcd(M+My,j0+Mx)​,可以看出ggg|g'gg

只需要判断j=j0,i=Mj=j_0,i=Mj=j0,i=M​是否成立就行了,因为gcd(i,j+t)gcd(i,j+t)gcd(i,j+t)有可能是at+1a_{t+1}at+1​​​​的倍数,这样条件就不成立。

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e4 + 10;

int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int nx, ny;
    int d = exgcd(b, a % b, nx, ny);
    x = ny;
    y = nx - a / b * ny;
    return d;
}

int lcm(int a, int b) { return a / __gcd(a, b) * b; }

pair<int, int> excrt(int k, int *a, int *r) {
    int M = r[1], ans = a[1];
    for (int i = 2; i <= k; i++) {
        int x0, y0;
        int c = a[i] - ans;
        int g = exgcd(M, r[i], x0, y0);
        if (c % g != 0) return {-1, -1};
        x0 = (__int128)x0 * (c / g) % (r[i] / g);
        ans = x0 * M + ans;
        M = lcm(M, r[i]);
        ans = (ans % M + M) % M;
    }
    return {ans, M};
}

int n, m, k, a[N];
int b[N];
signed main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= k; i++) cin >> a[i], b[i] = -(i - 1);

    pair<int, int> x = excrt(k, b, a);
    if (x.first == 0) x.first = x.second;

    if (x.first > m - k + 1 || x.second > n || x.first == -1) {
        cout << "NO";
    } else {
        for (int i = 0; i < k; i++)
            if (__gcd(x.first + i, x.second) != a[i + 1]) {
                cout << "NO";
                return 0;
            }
        cout << "YES";
    }
    return 0;
}
全部评论
a数组的lcm不会炸LL吗,还是数据水了
点赞 回复 分享
发布于 2022-06-04 20:44

相关推荐

2025-12-12 15:19
首先说明一下我眼中互联网大厂的定义:扎根互联网+对互联网影响重大T0:BAT(无先后)字节:如今&nbsp;TT&nbsp;已经成为全球最火的软件,直播电商创造的价值无法估计。对于&nbsp;AI&nbsp;技术,字节更是成立了&nbsp;seed&nbsp;部门,应用上有豆包,学术上有论文。阿里:业务就不多介绍,AI技术上和字节类似,通义实验室的&nbsp;AI&nbsp;也在国际上有一席之地。腾讯:更不用介绍,有鹅选鹅似乎永远不会过时。T1:蚂蚁蚂蚁:实际上,蚂蚁的认可度可以达到&nbsp;T0(当阿里用一点问题没有),熟悉商业史的同学都知道,蚂蚁没改名前叫做&quot;浙江阿里巴巴&quot;,除了这层关系,蚂蚁本身的业务、技术都配得上T0&nbsp;的宝座,把它排在&nbsp;T1&nbsp;主要还是&nbsp;bat&nbsp;的业务太广泛(且名义上不属于阿里巴巴)。T1.5:美团美团:个人感觉实力能够排在蚂蚁之后,但是认可度似乎还没那么高。即时零售已经成为电商领域的必争之地,美团作为霸主有非常多的优势。同时技术上,也是公认的很好,AI&nbsp;目前没有特别多的成果。T2:京东、pdd、滴滴、shopee、百度、shein、快手、TME、小红书等等,能够排在&nbsp;T2&nbsp;的定义:三个&nbsp;T2&nbsp;可以合成一个&nbsp;T0,这个层次的大厂认可度其实没有太大区别了,社招简历都能过筛。(TME&nbsp;的认可度也可以当腾讯用,但是&nbsp;TME&nbsp;本身实力不像蚂蚁,所以只能在&nbsp;T2)对于美团:我认为美团比&nbsp;T2&nbsp;其他大厂强很多,但是又比&nbsp;T1、T0&nbsp;的大厂逊色不少,就单独为&nbsp;T1.5&nbsp;了。中厂定义:不属于&nbsp;T2&nbsp;的互联网大公司,例如&nbsp;soul、陌陌、知乎、科大讯飞这种,他们有知名度,但是认可度差了&nbsp;T2&nbsp;一个档次,也没办法“三合一成为T0”
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务