已知,如果你调对了,你将会被关注,求:这个怎么调(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;
}