【洛谷P1463】反素数

题目大意:给定 \(N < 2e9\),求不超过 N 的最大反素数。

题解:
引理1:不超过 2e9 的数的质因子分解中,最多有 10 个不同的质因子,且各个质因子的指数和不超过30。
引理2:题目要求的最大反素数,实际上是求不超过 N 的数中因子数最多的数的集合中最小的那个数。
引理3:通过引理 2 以及交换证明法可以得出,各个质因子指数必须单调递减。

代码如下

#include <bits/stdc++.h>
using namespace std;

int n,cnt[15];
long long ans,sum;
int p[11]={0,2,3,5,7,11,13,17,19,23,29};

void dfs(int now,long long val,long long sum0){
	if(now==11){
		if(sum0>sum||(sum0==sum&&val<ans))ans=val,sum=sum0;
		return;
	}
	for(int i=0;i<=cnt[now-1];i++){
		if(val>n)break;
		cnt[now]=i;
		dfs(now+1,val,sum0*(i+1));
		val*=(long long)p[now];
	}
}

void solve(){
	ans=1e12,cnt[0]=0x3f3f3f3f;
	scanf("%d",&n);
	dfs(1,1,1);
	printf("%lld\n",ans);
}

int main(){
	solve();
	return 0;
} 
posted @ 2019-03-16 16:20  shellpicker  阅读(178)  评论(0编辑  收藏  举报