求条->玄关
查看原帖
求条->玄关
416975
sbno333楼主2024/5/3 18:11

已知,如果你调对了,你将会被关注,求:这个怎么调(0分,对两个数据)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int c[3600009][5];
int a[3600009][23];
int b[3600009];
int q[3600009];
int gcd(int l,int r){
	if(l>r){
		return 0;
	}
	int ans;
	ans=0;
	int len;
	len=r-l+1;
	len=__lg(len);
	ans=a[l][len];
	ans=__gcd(a[r-(1ll<<len)+1][len],ans);
	return ans;
}
int inn;
signed main(){
	int n;
	cin>>n;
	//cout<<f[2]<<endl;
	for(int i=1;i<=n;i++){
		cin>>q[i];
		//q[i]=f[q[i]];
		//cout<<q[i]<<endl;
	}
	inn=0;
	for(int i=1;i<=n;i++){
		if(q[i]%2==0){
			b[++inn]=i;
			a[inn][0]=q[i]/2;
			//cout<<b[inn]<<endl;
		}
	}
	for(int i=1;i<=21;i++){
		for(int j=1;j<=inn;j++){
			a[j][i]=__gcd(a[j][i-1],a[j+(1ll<<(i-1))][i-1]);
		}
	}
	//cout<<a[1][1]<<endl;
	c[inn+1][0]=c[inn+1][1]=c[inn+1][2]=0;
	b[inn+1]=0;
	for(int i=inn;i>=1;i--){
		c[i][0]=c[i+1][0]+(b[i]&1)*b[i];
		c[i][1]=c[i+1][1]+!(b[i]&1)*b[i];
		c[i][2]=c[i+1][2]+(b[i]&1);
		if(b[i]!=b[i+1]-1){
			c[i][0]=(b[i]&1)*b[i];
		c[i][1]=!(b[i]&1)*b[i];
		c[i][2]=(b[i]&1);
		}
	}
	int l;int ans;int r;int x;ans=0;
	//if(inn>=1){
		l=1;
	r=0;
	x=0;
	while(r<=inn){
		if(x!=1){
			x=__gcd(x,a[++r][0]);
			//cout<<r<<endl;
		}else{//cout<<l<<" "<<r<<" "<<x<<endl;
		if(b[r]==b[l]+r-l)
			if(!(b[l]&1)){
				ans+=c[r][0]-c[r][2]*(b[l]-1);
			}else{
				ans+=c[r][1]-(inn-r+1-c[r][2])*(b[l]-1);
			}
			//cout<<ans<<endl;
			l++;
			x=gcd(l,r);
		}
	}
	//}
	
	inn=0;
	for(int i=1;i<=n;i++){
		if(q[i]%3==0){
			b[++inn]=i;
			a[inn][0]=q[i]/3;
		}
	}
	for(int i=1;i<=21;i++){
		for(int j=1;j<=inn;j++){
			a[j][i]=__gcd(a[j][i-1],a[j+(1ll<<(i-1))][i-1]);
		}
	}
	c[inn+1][0]=c[inn+1][1]=c[inn+1][2]=0;
	b[inn+1]=0;
	for(int i=inn;i>=1;i--){
		
		c[i][0]=c[i+1][0]+(b[i]&1)*b[i];
		c[i][1]=c[i+1][1]+!(b[i]&1)*b[i];
		c[i][2]=c[i+1][2]+(b[i]&1);if(b[i]!=b[i+1]-1){
			c[i][0]=(b[i]&1)*b[i];
		c[i][1]=!(b[i]&1)*b[i];
		c[i][2]=(b[i]&1);
		}
	}
	//if(inn>=1){
		l=1;
	r=0;
	x=0;
	//cout<<endl;
	while(r<=inn){
		if(x!=1){
			x=__gcd(x,a[++r][0]);
			//cout<<x<<" "<<r<<" "<<a[r][0]<<endl;
		}else{
		//	cout<<l<<" "<<r<<" "<<x<<endl;
			if(b[r]==b[l]+r-l)
			if(b[l]&1){
				ans+=c[r][0]-c[r][2]*(b[l]-1);
			}else{
				ans+=c[r][1]-(inn-r+1-c[r][2])*(b[l]-1);
			}
		//	cout<<ans<<endl;
			l++;
			x=gcd(l,r);
			//cout<<x<<endl;
		}
	}
	///}
	
	cout<<ans;
	return 0;
}
2024/5/3 18:11
加载中...