我是靠谱客的博主 眯眯眼春天,最近开发中收集的这篇文章主要介绍【Ybtoj 第28章例4】反素数【质数和约数】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述
在这里插入图片描述


解题思路

首先1N中最大的反质数,就是1N中约数个数最多的数中最小的一个。其次,如果不同的质因数因子超过10的话,就会超出 2 ∗ 1 0 9 2*10^9 2109,并且所有质因子的质数总和不会超过 30 30 30,因为 2 31 > 2 ∗ 1 0 9 2^{31}>2*10^9 231>2109

并且我们要保证x的质因子是素数表中从2开始的连续若干个,且指数的质数单调递增。

证明:

  1. 如果质数不是连续的话,也就是p_1p_3,那么我们还不如选择p_1p_2
  2. 如果质数的指数不是单调递减的话,就会出现约数个数相等,但不是最小的情况。

根据上面的一系列性质,我们得出了最简洁的思路:使用DFS确定最小的十个质数的指数,且满足指数单调递减,总乘积不超过N,同时记录约数的个数。


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#define ll long long
#define ldb long double
using namespace std;

ll n,maxn,lyx;
int pri[15]={0,2,3,5,7,11,13,17,19,23,29};

void dfs(int s,int x,ll sum,int dep){
	if(s>maxn||(s==maxn&&sum<lyx))
		maxn=s,lyx=sum;
	ll ans,k=sum,i=0;
	while(i<dep)
	{
		i++;
		k=pri[x]*k,ans=s*(i+1);
		if(k>n)
			return;
		dfs(ans,x+1,k,i);
	}
}

int main(){
	scanf("%lld",&n);
	dfs(1,1,1,30);
	printf("%lld",lyx);
}

最后

以上就是眯眯眼春天为你收集整理的【Ybtoj 第28章例4】反素数【质数和约数】的全部内容,希望文章能够帮你解决【Ybtoj 第28章例4】反素数【质数和约数】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部