luoguP1463 [HAOI2007]反素数

题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 复制

1000

输出样例#1: 复制840

思路:一看这道题,不用说这是个数论,作为数学渣渣的我只好去看题解了,发现了这么有趣的一个规律。x=∏pi^ki其中p是质数,k是指数,那么因数的个数就是(k[1]+1)(k[2]+1)…..(k[n]+1)我们知道了这个规律,我们就可以打表搜索了代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #define ll long long
 4 using namespace std;
 5 ll n;
 6 ll maxn,ans;//maxn是更新因数的个数的,ans更新当前的答案
 7 int p[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51};
 8 void dfs(ll m,ll f,ll t,ll pr)
 9 {
10     if(t>maxn||(t==maxn)&&m<ans)//当此时的因数大与最优解的约数的个数,或者当他等于最优解,但是m小时,看题目中反素数的性质,更新最大约数,更新答案
11     {
12         ans=m;
13         maxn=t;
14     }
15     ll i=m,j=0,nt=0;//j代表当前的指数,因为指数应该是单调递减的所以枚举[j,pr)区间就可以了
16                     //i是这个数的大小,nt是因数的个数
17     while(j<pr)//循环结束的条件
18     {
19         j++;//指数增加
20         if(n/i<p[f])break;//如果乘了这个数超过了n就结束。
21         nt=t*(j+1),i*=p[f];//这个数需要乘以这个质数,还有因数的个数改变
22         if(i<=n)dfs(i,f+1,nt,j);//如果这个数还没有超过,那么进行下一层dfs
23     }
24 }
25 int main()
26 {
27     cin>>n;
28     dfs(1,1,1,32);
29     cout<<ans;
30     return 0;
31 }

 

原文地址:https://www.cnblogs.com/tpgzy/p/8974498.html

时间: 2024-10-10 03:54:55

luoguP1463 [HAOI2007]反素数的相关文章

【BZOJ 1053】 1053: [HAOI2007]反素数ant (反素数)

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的最大的反质数. Sample Input 1000 Sample Output

【BZOJ】1053: [HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Description: g(x)表示x的约数个数,反素数:对于任意的i (i < x),均有g(i) < g(x),则x为反素数:现在输入不超过2e9的数,要你找出不超过N的最大的反素数: 坑点:里面的反素数是严格小于,所以对于相同的约数要取较小的. 思路:直接深搜外加剪枝即可: #include<iostream> #include<cstdio> #include<cstring> #include<

[HAOI2007]反素数ant

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1907  Solved: 1069[Submit][Status][Discuss] 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的最大的反质数么?

bzoj 1053: [HAOI2007]反素数ant 搜索

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Status] 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

HAOI2007反素数

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1346  Solved: 732[Submit][Status] 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 一个

题解 P1463 【[POI2002][HAOI2007]反素数】

题目链接 Solution [POI2002][HAOI2007]反素数 题目大意:设\(x\)的约数个数为\(g(x)\),若对于所有\(i \in [1,x)\),都有\(g(i) < g(x)\),则称\(x\)为反素数,求不超过\(n\)的最大反素数 分析:这道题可以打表,但是打表也要讲求方法 对于\(n = 2 \times 10^9\)这种级别的数据,如果你用\(O(n^2)\)算法,估计你得搬出太湖之光才能以可以接受的速度跑完(而且你还得考虑并行计算效率问题) 我们把这个问题分成两

BZOJ1053 [HAOI2007]反素数 &amp; BZOJ3085 反质数加强版SAPGAP

BZOJ 1053 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的最大的反质数. Sample Input 1000 Sample Output 840 题解 可以发现,

BZOJ1053 [HAOI2007]反素数ant 数论

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? (1<=N<=2,000,000,000) 题解 对于任何一个反素数p,总有: p=2q1×3q2×5q3×7q4... 而且q

Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】

题目链接:https://www.luogu.org/problemnew/show/P1463 题意: 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 题解: 对于一个反素数p有两个结论: 若将p表示为 ∏(a[i]^k[i])的形式,其中a[i]为质因子,k[i]为指数. (1)a[i]为从2