AW198 反素數

題目地址


主要思路:

  • 素因子累乘並利用題目限制條件更新答案.

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int primes[26]={0,2,3,5,7,11,13,17,19,23,29,31,37},primeCnt=12;//質數表
int maxNum=-1,maxValue=-1;//最多的約數數量 最大反素數 
int n;
void dfs(ll nowValue,ll nowNum,int nowIndex){//當前總值 當前約數數量 當前位於哪個質數 
	if(nowNum>maxNum){//如果約數數量更多則直接更新 
		maxNum=nowNum;
		maxValue=nowValue;
	}else if(nowNum==maxNum&&nowValue<maxValue)maxValue=nowValue;//約數數量相同的情況下優先選擇儘量小的數 
	for(int i=nowIndex;i<=primeCnt;i++){
		ll key=1;//當前質數乘方(多次)後的值
		int tmp=1; 
		while(1){
			key*=primes[i];//當前質數乘方(多次)後的值
			if(nowValue*key>n)break;//如果總值超過n了則結束循環 
			dfs(nowValue*key,nowNum*(tmp+1),i+1);//合法則繼續遞歸 
			tmp++;
		} 
	}
}
int main(){
	scanf("%d",&n);
	dfs(1,1,1);//當前值爲1,約數數量爲1,位於第1個素數.
	printf("%d\n",maxValue); 
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章