南山住房和建设局网站,我公司要网站建设,合肥建设网站,苏州哪里做网站好F - GCD or MIN
首先gcd(x,y)≤min(x,y)\gcd(x,y)\leq \min(x,y)gcd(x,y)≤min(x,y)
数组中任意2个数的gcd可能是一种方案#xff0c;任意3个数的gcd可能是一种方案…
如果我们能够把原数组任意个数的gcd全部列出来#xff0c;能够满足题意的数一定在这些数之中#…F - GCD or MIN
首先gcd(x,y)≤min(x,y)\gcd(x,y)\leq \min(x,y)gcd(x,y)≤min(x,y)
数组中任意2个数的gcd可能是一种方案任意3个数的gcd可能是一种方案…
如果我们能够把原数组任意个数的gcd全部列出来能够满足题意的数一定在这些数之中并且如果这个数不大于min(a1→n)\min(a_{1\to n})min(a1→n)它一定能够最后存在先gcd把这个数搞出来然后一直取min即可。
显然我们不能把任意多个数的gcd求出了这时候尝试枚举每个数的约数如果一个数的约数是其他几个数的gcd这个数就可以作为答案称为一种方案。
判断一一些数的公共约数是否是最大公约数只需要把这些数全部gcd然后是不是它本身即可详细看代码。
时间复杂度O(NAlogA)O(N\sqrt{A}\log A)O(NAlogA)
#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
#pragma GCC optimize(2)
#includemap
#includeiostream
#includealgorithm
using namespace std;
constexpr int N2010;
int a[N],n;
mapint,int mp;
int main()
{IO;int T1;while(T--){cinn;for(int i1;in;i) cina[i];int vmin*min_element(a1,a1n);for(int i1;in;i)for(int j1;jmin(vmin,a[i]/j);j)if(a[i]%j0){if(!mp.count(j)) mp[j]a[i];else mp[j]__gcd(mp[j],a[i]);if(a[i]j*j) continue;if(a[i]/jvmin) {if(!mp.count(a[i]/j)) mp[a[i]/j]a[i];else mp[a[i]/j]__gcd(mp[a[i]/j],a[i]);}}int res0;for(auto[a,b]:mp)resint(ab);coutres\n;}return 0;
}要加油哦~