Codeforces Round #641 (Div. 2) C. Orac and LCM ###K ###K //K
题意:对于所有的对 lcm(a[i],a[j] | i<j) 求gcd(每一对lcm)
题目链接:https://codeforces.ml/contest/1350/problem/C
思路: 首先要知道 两个整数的gcd和lcm中存在分配律
gcd(a,lcm(b,c))=lcm(gcd(a,b),gcd(a,c))
lcm(a,gcd(b,c))=gcd(lcm(a,b),lcm(a,c))
只看和a1的组合 那么 要求的gcd1=gcd( lcm(a1,a2),lcm(a1,a3),lcm(a1.a4) )
则gcd1=lcm(a1,gcd(a2,a3,a4……))
那么gcd2=lcm(a2,gcd(a3,a4,a5……)) gcd1,gcd2……维护一下后缀gcd即可求得
最后ans=gcd(gcd1,gcd2,gcdn)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =1e5+10; 6 ll a[maxn]; 7 ll gcd(ll a,ll b) 8 { 9 if(b==0) return a; 10 else return gcd(b,a%b); 11 } 12 ll suf[maxn]; 13 int main() 14 { 15 ios::sync_with_stdio(false); 16 cin.tie(0); 17 int n; 18 cin>>n; 19 for(int i=1;i<=n;i++) 20 { 21 cin>>a[i]; 22 } 23 ll ans=0; 24 for(int i=n;i>=1;i--) 25 { 26 suf[i]=gcd(a[i],suf[i+1]); 27 } 28 for(int i=1;i<=n;i++) 29 { 30 ll x=a[i]*suf[i+1]/gcd(a[i],suf[i+1]); 31 ans=gcd(ans,x); 32 } 33 cout<<ans<<'\n'; 34 35 36 37 38 }

浙公网安备 33010602011771号