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 }
View Code

 

posted @ 2020-05-28 10:35  canwinfor  阅读(167)  评论(0)    收藏  举报