P15032 棋子
从初始位置
从
注意,有负数的情况下,最大公约数计算结果可能为负。所以取个绝对值,求出
:::info[示例代码]
区间求最大公约数,采用线段树实现。
仅供参考。
void build(int k,int l,int r){
if(l==r){s3[k]=c[l];return;}
build(ls,l,mid);build(rs,mid+1,r);
s3[k]=gcd(s3[ls],s3[rs]);
}ll query(int k,int l,int r,int x,int y){
if(x<=l and r<=y)return s3[k];
if(y<=mid)return query(ls,l,mid,x,y);else if(x>=mid+1)return query(rs,mid+1,r,x,y);
else return gcd(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y));
}
int main(){
read(n,m);
for(int i=1;i<=n;++i)read(c[i]),c[i]-=m,c[i]=abs(c[i]);
build(1,1,n);
write(query(1,1,n,1,n));
}
:::