求助月赛T3 16pts
  • 板块学术版
  • 楼主Emptyhanded
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/22 17:39
  • 上次更新2023/11/3 08:13:51
查看原帖
求助月赛T3 16pts
358999
Emptyhanded楼主2023/7/22 17:39

逆元求lcm,双模哈希,记录

#include <iostream>
#include <cstdio>
#define int long long
const int MOD1=1145141;
const int MOD2=948187;
int Power1(int x,int y) {
    int ans=1;
    int base=x%MOD1;
    while(y) {
        if(y&1) ans=ans*base%MOD1;
        base=base*base%MOD1;
        y>>=1;
    }return ans;
}
int Power2(int x,int y) {
    int ans=1;
    int base=x%MOD2;
    while(y) {
        if(y&1) ans=ans*base%MOD2;
        base=base*base%MOD2;
        y>>=1;
    }return ans;
}
int gcd1(int x,int y){return x%y?gcd1(y,x%y)%MOD1:y%MOD1;}
int gcd2(int x,int y){return x%y?gcd2(y,x%y)%MOD2:y%MOD2;}
int lcm1(int x,int y){return x*Power1(gcd1(x,y),MOD1-2)%MOD1*y%MOD1;}
int lcm2(int x,int y){return x*Power2(gcd2(x,y),MOD2-2)%MOD2*y%MOD2;}
int T;
signed main() {
    for(scanf("%lld",&T);T--;) {
        int n,a[500005];
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        int gcdsum1=gcd1(a[1],a[2]);
        int gcdsum2=gcd2(a[1],a[2]);
        int lcmsum1=lcm1(a[1],a[2]);
        int lcmsum2=lcm2(a[1],a[2]);
        int times1=1,times2=1;
        for(int i=1;i<=n;i++) times1=times1*a[i]%MOD1;
        for(int i=1;i<=n;i++) times2=times2*a[i]%MOD2;
        for(int i=3;i<=n;i++) gcdsum1=gcd1(gcdsum1,a[i])%MOD1;
        for(int i=3;i<=n;i++) gcdsum2=gcd2(gcdsum2,a[i])%MOD2;
        for(int i=3;i<=n;i++) lcmsum1=lcm1(lcmsum1,a[i])%MOD1;
        for(int i=3;i<=n;i++) lcmsum2=lcm2(lcmsum2,a[i])%MOD2;
        if(gcdsum1*lcmsum1%MOD1==times1&&gcdsum2*lcmsum2%MOD2==times2) puts("Yes");
        else puts("No");
    }
    return 0;
}
2023/7/22 17:39
加载中...