QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#782641#9748. 最大公因数的平方和ZpairWA 2ms6028kbC++202.0kb2024-11-25 20:49:402024-11-25 20:49:41

Judging History

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

  • [2024-11-25 20:49:41]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:6028kb
  • [2024-11-25 20:49:40]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ll;
const int N=1e5+5;
int mu[N],a[N],b[N],n,B;
ll f[N],ans[N];
int l1[N],r1[N],l2[N],r2[N],m;
bool pd[N];
vector<int> d[N];
int s1[N],s2[N];
struct node{
	int x;ll v;
};
struct node2{
	int x,y,idx,op;
};
vector<node2> qr[N];
vector<node> vet[N];
vector<int> ad[N],bd[N];
int mp[N],l[N],r[N];
ll sum[N],val[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;++i)
		scanf("%d",&b[i]);
	mu[1]=1;
	for(int i=2;i<=n;++i)if(!pd[i]){
		mu[i]=-1;
		for(int j=i+i;j<=n;j+=i)
			mu[j]=-mu[j/i],pd[j]=1;
	}
	for(int i=1;i<=n;++i)
		for(int j=i;j<=n;j+=i)
			d[j].push_back(i);
	for(int i=1;i<=n;++i)
		for(int x:d[a[i]])
			ad[x].push_back(i);
	for(int i=1;i<=n;++i)
		for(int x:d[b[i]])
			bd[x].push_back(i);
	for(int i=1;i<=n;++i)
		for(int j=1;j*i<=n;++j)
			f[i*j]+=(ll)mu[i]*j*j;
	cin>>m;
	for(int i=1;i<=m;++i)
		scanf("%d%d%d%d",&l1[i],&r1[i],&l2[i],&r2[i]);
	B=sqrt(n);
	for(int x=1;x<=B;++x){
		for(int i=1;i<=n;++i)
			s1[i]=s1[i-1]+(a[i]%x==0);
		for(int i=1;i<=n;++i)
			s2[i]=s2[i-1]+(b[i]%x==0);
		for(int i=1;i<=m;++i)
			ans[i]+=f[x]*(s1[r1[i]]-s1[l1[i]-1])*(s2[r2[i]]-s2[l2[i]-1]);
	}
	for(int x=B+1;x<=n;++x)
		for(int i:ad[x])
			for(int j:bd[x])
				vet[i].push_back({j,f[x]});

	for(int i=1;i<=n;++i){
		mp[i]=i/B;
		if(!l[mp[i]])
			l[mp[i]]=i;
		r[mp[i]]=i;
	}
	for(int i=1;i<=m;++i){
		qr[r1[i]].push_back({l2[i],r2[i],i,1});
		qr[l1[i]-1].push_back({l2[i],r2[i],i,-1});
	}
	for(int i=1;i<=n;++i){
		for(auto [x,v]:vet[i]){
			val[x]+=v;
			sum[mp[x]]+=v;
		}
		for(auto [x,y,id,op]:qr[i]){
			int bx=mp[x],by=mp[y];
			if(bx==by){
				for(int i=x;i<=y;++i)
					ans[id]+=op*val[i];
			}
			else{
				for(int i=x;i<=r[bx];++i)
					ans[id]+=op*val[i];
				for(int i=bx+1;i<by;++i)
					ans[id]+=op*sum[i];
				for(int i=l[by];i<=y;++i)
					ans[id]+=op*val[i];
			}
		}
	}
	for(int i=1;i<=m;++i)
		printf("%u\n",ans[i]);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6028kb

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:

2
14
12
1
4

result:

ok 5 lines

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 4700kb

input:

1000
564 82 818 337 917 532 941 590 783 74 256 176 714 159 262 803 869 716 12 448 523 981 664 533 797 520 872 966 710 103 118 101 288 113 363 356 87 475 515 641 147 374 424 788 883 496 230 157 926 942 999 220 886 509 987 99 400 458 993 343 946 684 205 4 925 727 875 939 830 95 486 870 741 846 916 321...

output:

21813763
1246074
277861
4763347
46474208
69758586
1505957
216875165
1728014
879218
822545
70822310
57026771
48534314
3321792
10664091
15910674
81932461
142026227
77503898
53034684
5374865
10276910
154589395
56335044
11568831
47827693
3607792
62986341
30391263
108312101
16656515
31648151
8808985
1590...

result:

wrong answer 1st lines differ - expected: '21490984', found: '21813763'