HYSBZ 1053 反质数

input

n 1<=n<=2000000000

output

不大于n的最大反质数

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

做法:直接打表查找

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <ctime>
11 #include <cmath>
12 #include <cctype>
13 #define MAX 100000
14 #define INF 2000000000
15 #define LL long long
16 int cas=1,T,n,a[MAX],an,p[10]={2,3,5,7,11,13,17,19,23,29};
17 struct node
18 {
19     int b[10],n,v,g;            //b数组是质数对应的次方,v是值,g是约数个数,n是质因子个数
20     bool operator<(node a)const { return v>a.v; }
21 };
22 void init()
23 {
24     std::priority_queue<node>q;
25     a[0]=1;an=1;
26     int ming=1;//当前最大的约数个数
27     node u;
28     u.v=2;u.n=0;u.b[0]=1;u.g=2;
29     q.push(u);
30     while(!q.empty())
31     {
32         u=q.top();q.pop();
33 //        printf("%d %d %d\n",u.v,u.g,u.n);
34         if(u.g>ming) { ming=u.g;a[an++]=u.v; }//比当前最大约数个数大的统计
35         else continue;
36         for(int i=0;i<=u.n;i++)//出队后将每个质数对应的次方加一放进队列里
37         {
38             node v;
39             memcpy(&v,&u,sizeof(node));
40             LL tmp=(LL)v.v*p[i];
41             v.b[i]++;
42             v.g=v.g/v.b[i]*(v.b[i]+1);
43             if(tmp<=INF) v.v=tmp;
44             if(tmp<=INF&&v.g>ming) q.push(v);
45 //            printf("aaa:%d %d %d\n",v.v,v.g,v.n);
46         }
47         if(u.n+1<9)//增加一个质因子
48         {
49             node v;
50             memcpy(&v,&u,sizeof(node));
51             v.n++;v.b[v.n]=1;v.g*=2;
52             LL tmp=(LL)v.v*p[v.n];
53             if(tmp<=INF) v.v=tmp;
54             if(tmp<=INF&&v.g>ming) q.push(v);
55         }
56     }
57     a[an++]=INF+10;
58     printf("%d\n",an);
59     for(int i=0;i<an;i++) printf("%d,",a[i]);
60 }
61 int main()
62 {
63     //freopen("in","r",stdin);
64     //scanf("%d",&T);
65     init();
66     while(scanf("%d",&n)==1) printf("%d\n",*(std::upper_bound(a,a+an,n)-1));
67     //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
68     return 0;
69 }    

时间: 2024-07-29 23:28:57

HYSBZ 1053 反质数的相关文章

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 HINT Source 开始没有想清楚这

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 题解 可以发现,

CNUOJ 0486 800401反质数

难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g(6)=4. 如果对于任意正整数y,当 0 < y < x 时,x 都满足 g(x) > g(y), 则称 x 为反质数.整数 1,2,4,6 等都是反质数. 现在任意给定两个正整数 M, N,其中,M < N <= 20000000,按从小到大输出其中(包括 M 和 N)的所有

反质数问题,求不大于n的最大反质数

反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数 我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = p1^k1+p2^k2...pn^kn 一个数n如果可以表示成 n = p1^k1 + p2^k2, 那么它的约数的个数就是 (k1+1)*(k2+1) ::k1个p1,可以产生k1个约数,分别是p1^1, p1^2...p1^k1, 同理k2个p2 那么这k1个约数与k2个约数分别相乘,又会得到k1*k2个

反质数

问题描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 分析 这道试题的数学性质很强,关键点在于“一个数与其约数”的关系.在设计算法之前,我们不妨先对“一个数与其约数”进行一番简单的分析. 先举个简单的例子,求一个数756的约数总个数. 大家都知道先将756分解质因子,得到756=22×33×7

COJ 0486 800401反质数

800401反质数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g(6)=4. 如果对于任意正整数y,当 0 < y < x 时,x 都满足 g(x) > g(y), 则称 x 为反质数.整数 1,2,4,6 等都是反质数. 现在任意给定两个正整数 M, N,其中,M < N <= 20000000,按从小到大输出其中(包括

【模板】【数学】反质数

题目链接:https://www.luogu.com.cn/problem/P1463 其实反质数就是要约数最大,在此前提下这个数最小. 然后它分解出来的质数一定是连续的,并且分解出来的质数的指数是单调递减的,所以可以dfs求. 参考:https://blog.csdn.net/qq_40942372/article/details/82016727 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll;

BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: int prime[]= { 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,103,107,109, 113,127,131,137,139, 14

BZOJ——T 1053: [HAOI2007]反素数ant

http://www.lydsy.com/JudgeOnline/problem.php?id=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的最大的反质数. S