链接 https://www.luogu.com.cn/problem/P3518
题解:
玄学
显然 gcd(x,n)是答案,
考虑如果一个数y是答案 ,那么2y 3y 4y是答案
然后考虑所有答案的GCD 下同
发现如果最小的答案是y,那么所有答案就是2y 3y 4y,因为最小的GCD也是答案,即这时候y就是最小的GCD
未完待续
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath> #include<queue> #include<vector> #include<climits> #include<string> #include<cstdlib> #include<ctime> using namespace std; long long a[500000],q[1000005],f[1000005],i,j,ans; long long tot,n,k; long long gcd(long long a,long long b) { return b? gcd(b,a%b):a; } int main() { scanf("%lld%lld",&n,&k); for(i=1;i<=k;i++) scanf("%lld",&a[i]); a[k]=gcd(a[k],n); for(i=1;i<k;i++) a[i]=gcd(a[i],a[k]); for(i=1;i*i<=a[k];i++) if(a[k]%i==0) { q[++tot]=i; if(i*i!=a[k]) q[++tot]=a[k]/i; } sort(q+1,q+tot+1); for(i=1;i<k;i++) f[lower_bound(q+1,q+tot+1,a[i])-q]=1; for(i=1;i<=tot;i++) if(f[i]) for(j=1;j<i;j++) if(q[i]%q[j]==0) f[j]=1; for(ans=1;f[ans];ans++); printf("%lld\n",n/q[ans]); return 0; }