[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;
}
不摆烂了,写题

浙公网安备 33010602011771号