牛客小白月赛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逆向思维求出到底要到哪个阶乘,贼麻烦
后面看了大佬代码,把阶乘初始成因数,然后正向演绎就完事了
创作不易
全部评论

相关推荐

09-27 18:15
门头沟学院 C++
在努力的小牛:来告诉你 录用评估挂就是同期好几个候选人,部门负责人选了其他人。
点赞 评论 收藏
分享
10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
10 收藏 评论
分享
牛客网
牛客企业服务