[BalticOI 2000]Division expression 题解(math)

题目链接

题目思路

仔细思考后就就会发现就是判断

\((a[1]\times a[3]\times a[4]....a[n])\%a[2]\)是否等于0

我写的是先把\(a[2]\)质因子分解,最多\(30\)个左右,然后让其他数对这些质因子进行分解,有点麻烦

其实可以直接对于每个\(i(i!=2)\; a[2]=a[2]/gcd(a[2],a[i])\)

最后判断\(a[2]\)是否为\(1\)即可

方法1代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
int a[maxn];
pair<int,int> pa[maxn];
signed main(){
    int _;scanf("%d",&_);
    while(_--){
        int tot=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        if(n==1){
            printf("YES\n");
            continue;
        }
        for(ll i=2;i*i<=a[2];i++){
            if(a[2]%i==0){
                int cnt=0;
                while(a[2]%i==0){
                    a[2]=a[2]/i;
                    cnt++;
                }
                pa[++tot]={i,cnt};
            }
        }
        if(a[2]!=1){
            pa[++tot]={a[2],1};
        }
        for(int i=1;i<=n;i++){
            if(i==2) continue;
            for(int j=1;j<=tot;j++){
                if(a[i]==0) continue;
                while(a[i]%pa[j].fi==0){
                    a[i]=a[i]/pa[j].fi;
                    pa[j].se--;
                }
            }
        }
        bool flag=1;
        for(int i=1;i<=tot;i++){
            if(pa[i].se>0) flag=0;
        }
        if(flag){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }

    return 0;
}

方法2代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
int a[maxn];
signed main(){
    int _;scanf("%d",&_);
    while(_--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            if(i==2) continue;
            a[2]=a[2]/__gcd(a[2],a[i]);
        }
        if(n==1||a[2]==1){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

posted @ 2021-05-23 16:06  hunxuewangzi  阅读(78)  评论(0)    收藏  举报