题意:
给你2个序列,然后求这个序列里面的所有值的阶乘相乘是否相等。
思路:
首先我们可以开2个数组,分别记录2个序列的阶乘的因子的个数,然后在把他们2个有且共同的消除掉,然后对剩下的数进行因式分解,得到唯一的分解式,最后判断每个值是否一样就是了。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int man = 1e5+10;
int pre1[man],pre2[man],pre[man],fac1[man],fac2[man];
void get(int *fac,int num,int ge){//唯一分解
for(int i = 2;i*i<=num;i++){
if(num%i==0){
while(num%i==0){
fac[i] += ge;
num /= i;
}
}
}
if(num>1)fac[num] += ge;
}
int main(){
int t;
cin >> t;
while(t--){
int n,m;
memset(pre1,0,sizeof(pre1));
memset(pre2,0,sizeof(pre2));
memset(pre,0,sizeof(pre));
memset(fac1,0,sizeof(fac1));
memset(fac2,0,sizeof(fac2));
cin >> n >> m;
int maxx;
for(int i = 1;i <= n;i++){
int num;cin >> num;
maxx = max(maxx,num);
if(num!=0){
pre1[2] += 1;
pre1[num+1] -= 1;
}
}
for(int i = 1;i <= m;i++){
int num;cin >> num;
maxx = max(maxx,num);
if(num!=0){//差分
pre2[2] += 1;
pre2[num+1] -= 1;
}
}
for(int i = 2;i <= maxx;i++){//通过前缀和得到总的
pre1[i] += pre1[i-1];
pre2[i] += pre2[i-1];
pre[i] = pre1[i]-pre2[i];
// printf("i:%d pre1:%d pre2:%d pre:%d\n",i,pre1[i],pre2[i],pre[i]);
}
for(int i = 2;i <= maxx;i++){
if(pre[i]==0)continue;
if(pre[i]<0){//把大于0与小于0的区分开为2个数
int num = -pre[i];
get(fac1,i,num);
}else{
int num = pre[i];
get(fac2,i,num);
}
}
int flag = 1;
for(int i = 2;i <= maxx;i++){
// cout << fac1[i] <<' ' << fac2[i] <<endl;
if(fac1[i]!=fac2[i]){//通过唯一分解定理,2个相等的数分解的式子必然相等。
flag = 0;
break;
}
}
if(flag)cout << "equal" <<endl;
else cout << "unequal" <<endl;
}
return 0;
}