2014黑龙江省赛热身赛Big LCM

题目描述:给定一个整数n(<=200)然后有3三行 每行有n个数(<=10^9)每行的乘积表示一个数,求这三个数的最小公倍数

思路:把每个数素因子分解就OK了

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const int M = 1e9+7;
int main()
{
    int n;
    set<int >p;
    map<int , int > a;
    map<int ,int > b;
    map<int ,int >c;
    set<int >::iterator it;
    while(cin>>n){
          int x;
          p.clear();
          a.clear();
          b.clear();
          c.clear();
          for(int i=0;i<n;i++){
             cin>>x;
             int tn=x;
             for(int k=2;k<=x&&k<=tn;k++){
                 if(tn%k==0){
                        p.insert(k);
                    while(tn%k==0){
                        tn/=k;
                        a[k]++;
                    }
                 }
             }
          }
          for(int i=0;i<n;i++){
             cin>>x;
             int tn=x;
             for(int k=2;k<=x&&k<=tn;k++){
                 if(tn%k==0){
                        p.insert(k);
                    while(tn%k==0){
                        tn/=k;
                        b[k]++;
                    }
                 }
             }
          }
          for(int i=0;i<n;i++){
             cin>>x;
             int tn=x;
             for(int k=2;k<=x&&k<=tn;k++){
                 if(tn%k==0){
                        p.insert(k);
                    while(tn%k==0){
                        tn/=k;
                        c[k]++;
                    }
                 }
             }
          }
             long long sum=1;
             for(it=p.begin();it!=p.end();it++){
               for(int k=1;k<=max(a[*it],max(b[*it],c[*it]));k++)
                   sum=(sum%M)*(*it);
          }
          cout<<sum<<endl;
    }
return 0;
}


你可能感兴趣的:(2014黑龙江省赛热身赛Big LCM)