题解:P13014 [GESP202506 五级] 最大公因数
题意
给定正整数序列
做法
最大公因数的性质有:
对于查询
先停一下,有的同学有疑惑:上面的是怎么推导出来的?
对于
证明:\
设
-
- 因此
g 整除x_j-x_1 (对所有j )。 - 故
g 是\{x_1,x_2-x_1,\dots,x_k-x_1\} 的公因数。
反之,设
-
- 因此
g' 整除x_j=(x_j-x_1)+x_1 (对所有j )。 - 故
g' 是\{x_1, x_2, \dots, x_k\} 的公因数。
综上可得
利用性质
我们考虑预处理差值的最大公因数
令
每个查询的答案简化为:
CODE
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005],d[100005],n,q;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
int D=0;
for(int i=2;i<=n;i++)d[i-1]=a[i]-a[1];
D=d[1];
for(int i=2;i<n;i++)D=gcd(D,d[i]);
for(int i=1;i<=q;i++){
cout<<gcd(a[1]+i,D)<<"\n";
}
}