求助 wa5个点
查看原帖
求助 wa5个点
1318260
w505255252楼主2025/7/23 21:02
#define N 1000000
int fac[1000005][3];
int g[1005][1005];
int prime[N];
bool vis[N];
int cnt = 1;
ll a[5005];
ll b[5005];

void init() {
    fac[1][1] = fac[1][0] = fac[1][2] = 1;
    for (int i = 2;i <= N;i++) {
        if (!vis[i]) {
            prime[cnt++] = i;
            fac[i][0] = i;
            fac[i][1] = 1;
            fac[i][2] = 1;
        }
        for (int j = 1;j < cnt;j++) {
            if (i * prime[j] > N)break;
            vis[i * prime[j]] = true;
            fac[i * prime[j]][0] = fac[i][0] * prime[j];
            fac[i * prime[j]][1] = fac[i][1];
            fac[i * prime[j]][2] = fac[i][2];
            sort(fac[i * prime[j]], fac[i * prime[j]] + 3);
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
    for (int i = 1;i <= 1000;i++) {
        g[i][0] = g[0][i] = i;
        for (int j = 1;j <= i;j++) {
            g[i][j] = g[j][i] = g[j][i % j];
        }
    }
}


ll getgcd(int x, int y) {
    if (x == 1 || y == 1)return 1;
    int a = (fac[x][0] <= 1000) ? g[fac[x][0]][y % fac[x][0]] : (y % fac[x][0] == 0) ? fac[x][0] : 1;
    y = y / a;
    int b = (fac[x][1] <= 1000) ? g[fac[x][1]][y % fac[x][1]] : (y % fac[x][1] == 0) ? fac[x][1] : 1;
    y = y / b;
    int c = (fac[x][2] <= 1000) ? g[fac[x][2]][y % fac[x][2]] : (y % fac[x][2] == 0) ? fac[x][2] : 1;
    return a * b * c;
}


void solve() {
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++)cin >> a[i];
    for (int i = 1;i <= n;i++)cin >> b[i];
    for (int i = 1;i <= n;i++) {
        ll temp = 1;
        ll sum = 0;
        for (int j = 1;j <= n;j++) {
            temp = temp * i % MOD;
            sum = (sum + (ll)temp * getgcd(a[i], b[j]) % MOD) % MOD;
        }
        cout << sum << endl;
    }
}

2025/7/23 21:02
加载中...