QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#766318 | #9748. 最大公因数的平方和 | louisliang | WA | 0ms | 20532kb | C++14 | 2.3kb | 2024-11-20 16:57:00 | 2024-11-20 16:57:00 |
Judging History
answer
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<cstring>
using namespace std;
const int N = 2e5 + 10, B = 400;
unsigned int f[N], sa[N], sb[N], a[N], b[N], ans[N], sum[N], cnt[N];
int n, q, pb[N], lx[N], rx[N], posb[N], la[N], ra[N], lb[N], rb[N];
struct Quest{
int x, l, r, id;
unsigned int op;
};
vector <Quest> vt;
vector <int> d[N];
int main(){
// freopen("gcd.in", "r", stdin);
// freopen("gcd.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++){
cin >> b[i];
posb[b[i]] = i;
}
for(int i = 1; i <= q; i++){
cin >> la[i] >> ra[i] >> lb[i] >> rb[i];
vt.push_back((Quest){la[i] - 1, lb[i], rb[i], i, (unsigned int)-1});
vt.push_back((Quest){ra[i], lb[i], rb[i], i, 1});
}
f[1] = 1;
for(int i = 2; i <= n; i++){
f[i] = 1ll * i * i - f[1];
for(int j = 2; j * j <= i; j++){
if(i % j == 0){
f[i] -= f[j];
if(j * j != i)
f[i] -= f[i / j];
}
}
}
for(int i = 1; i <= B; i++){
for(int j = 1; j <= n; j++){
sa[j] = sa[j - 1], sb[j] = sb[j - 1];
if(a[j] % i == 0)
sa[j] += f[i];
if(b[j] % i == 0)
sb[j] += 1;
}
for(int j = 1; j <= q; j++)
ans[j] += (sa[ra[j]] - sa[la[j] - 1]) * (sb[rb[j]] - sb[lb[j] - 1]);
}
for(int i = 1; ; i++){
lx[i] = (i - 1) * B + 1, rx[i] = min(i * B, n);
for(int j = lx[i]; j <= rx[i]; j++)
pb[j] = i;
if(rx[i] == n)
break;
}
for(int i = B + 1; i <= n; i++)
for(int j = i; j <= n; j += i)
d[j].push_back(i);
sort(vt.begin(), vt.end(), [](Quest x, Quest y){return x.x < y.x;});
int tla = 0;
for(auto t : vt){
while(tla < t.x){
tla++;
for(int i : d[a[tla]])
for(int j = i; j <= n; j += i)
sum[pb[posb[j]]] += f[i], cnt[posb[j]] += f[i];
}
if(pb[t.l] == pb[t.r])
for(int i = t.l; i <= t.r; i++)
ans[t.id] += t.op * cnt[i];
else{
int l = pb[t.l], r = pb[t.r];
for(int i = t.l; i <= rx[l]; i++)
ans[t.id] += t.op * cnt[i];
for(int i = lx[r]; i <= t.r; i++)
ans[t.id] += t.op * cnt[i];
for(int i = l + 1; i < r; i++)
ans[t.id] += t.op * sum[i];
}
}
for(int i = 1; i <= q; i++)
cout << ans[i] << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 20532kb
input:
5 4 1 5 3 2 1 2 3 4 5 5 3 3 2 3 3 4 2 4 3 4 3 4 5 5 1 1 1 1 2 2
output:
10 17 7 1
result:
wrong answer 1st lines differ - expected: '2', found: '10'