QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#766318#9748. 最大公因数的平方和louisliangWA 0ms20532kbC++142.3kb2024-11-20 16:57:002024-11-20 16:57:00

Judging History

你现在查看的是最新测评结果

  • [2024-11-20 16:57:00]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:20532kb
  • [2024-11-20 16:57:00]
  • 提交

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;
}

详细

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'