BZOJ 1053: [HAOI2007]反素数ant

Description

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么

Input

一个数N(1<=N<=2,000,000,000)。

Output

不超过N的最大的反质数。


题解:
我们要求范围内最小的因数最多的数

对于一个整数x,可以将它唯一分解为 x = p 1 a 1 ∗ p 2 a 2 ∗ . . . ∗ p n a n x = p_1^{a_1}*p_2^{a_2}*...*p_n^{a_n} x=p1a1p2a2...pnan的形式,其中p为质数,那么它的因子个数为 ( a 1 + 1 ) ∗ ( a 2 + 1 ) ∗ . . . ∗ ( a n + 1 ) (a_1+1)*(a_2+1)*...*(a_n+1) (a1+1)(a2+1)...(an+1),要求质数最小,那么显然p从2开始,然后爆搜即可


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define int long long
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
const int MAXN = 1e5+10;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
int pri[15]={1,2,3,5,7,11,13,17,19,23,29,31};
int n,ans=1,num=1;
void dfs(int now,int val,int cnt,int last){
	if(now==12){
		if(val>ans&&cnt>num){ ans=val;num=cnt; }
		if(val<=ans&&cnt>=num){ ans=val;num=cnt; }
		return;
	}
	for(int i=0,t=1;i<=last;i++){
		dfs(now+1,val*t,cnt*(i+1),i);
		t*=pri[now];
		if(val*t>n) break;
	}
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGE
	scanf("%lld",&n);
	dfs(1,1,1,20);
	printf("%lld",ans);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值