牛客小白月赛23b阶乘,因数分解+模拟+数学
阶乘
https://ac.nowcoder.com/acm/contest/4784/B
先因数分解出因数和次数,然后找到最大的(因数*个数)
如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逆向思维求出到底要到哪个阶乘,贼麻烦
后面看了大佬代码,把阶乘初始成因数,然后正向演绎就完事了
创作不易