先因数分解出因数和次数,然后找到最大的(因数*个数)
如2*3*3*3*5*5这个数最大的(因数*个数)是5x2,所以只要遍历到10!,2和3,6,9都遍历过2,3系数都满足
还有注意例如次方情况,
如要满足3^14不是(3*14)!而是(3*10)!
因为这里9,18里有两个3,而27里有三个3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5;
ll prime[N],num[N],fct[N],cnt,f,nn;
ll t,p,ma;
void getDivide(int x){
cnt=0;
for(int i=2;i<=x/i;i++){
if(x%i==0){
prime[cnt]=i;
while(x%i==0){
num[cnt]++;
x/=i;
}
//找到该系数最小的阶乘f
f=i,nn=0;
for(f=i;;f+=i){
for(int j=f;j%i==0;j/=i)nn++;
if(nn>=num[cnt]) break;
}
fct[cnt]=f;
cnt++;
}
}
if(x>1) prime[cnt]=x, num[cnt]=1, fct[cnt]=x, cnt++;
}
int main(){
cin>>t;
for(int i=0;i<t;i++){
cin>>p;
memset(prime,0,sizeof prime);
memset(num,0,sizeof num);
memset(fct,0,sizeof fct);
getDivide(p);
ma=1;
for(int i=0;i<cnt;i++){
ma=max(fct[i],ma);
}
cout<<ma<<endl;
}
return 0;
} 本来是想分解出因数和次数比如3^14逆向思维求出到底要到哪个阶乘,贼麻烦
后面看了大佬代码,把阶乘初始成因数,然后正向演绎就完事了
创作不易

京公网安备 11010502036488号