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,按从小到大输出其中(包括 M 和 N)的所有反质数。如果没有,则输出大写的NO。


输入

一行,包含两个正整数M和N,用单个空格隔开。

输出

在一行内输出所有反质数,以逗号间隔。如果没有,则输出 NO。

输入示例

1 13

输出示例

1,2,4,6,12

其他说明

 

题解:我非常想分享一下这道题的艰辛历程= =

首先:这还不好办?分块打表!结果发现它不是问数量。。。= =

那也可以呀?我们不分块直接打表不好嘛?

于是就有了下图,发现根本交不上去。。。= =

那那那。。。窝萌就把所有的反质数都打出来呗。。。。

结果。。。。。。。。。。。。。。。。。。。。。。

呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵

呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵

呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵

呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵,呵

这个惨痛的教训告诉窝萌:打表,是一项技术活。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

附打表程序:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=20000000+10,maxv=20000000;
11 int a[maxn];bool b[maxn];
12 int cal(int x){
13     if(x==1)return 1;
14     int lim=(int)sqrt(x),ans=2;
15     for(int i=2;i<=lim;i++)if(x%i==0)ans+=2;
16     if(lim*lim==x)ans-=1;return ans;
17 }
18 inline int read(){
19     int x=0,sig=1;char ch=getchar();
20     for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)sig=0;
21     for(;isdigit(ch);ch=getchar())x=10*x+ch-‘0‘;
22     return sig?x:-x;
23 }
24 inline void write(int x){
25     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
26     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
27     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
28 }
29 void init(){
30     freopen("b.txt","w",stdout);
31     for(int i=1;i<=maxv;i++)a[i]=cal(i);int mx=1;b[1]=true;
32     for(int i=2;i<=maxv;i++)if(mx<a[i])mx=a[i],b[i]=true;
33     int cnt=0;
34     for(int i=1;i<=maxv;i++){
35         if(b[i])a[cnt++]=i;
36     }
37     int tot=0;
38     for(int i=0;i<cnt;i++){
39         if(++tot==10)tot=0,ENT;
40         printf("p[%d]=%d;",i,a[i]);
41     }
42     return;
43 }
44 void work(){
45     return;
46 }
47 void print(){
48     return;
49 }
50 int main(){init();work();print();return 0;}

AC代码。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=50+10;int p[maxn];
11 inline int read(){
12     int x=0,sig=1;char ch=getchar();
13     for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)sig=0;
14     for(;isdigit(ch);ch=getchar())x=10*x+ch-‘0‘;
15     return sig?x:-x;
16 }
17 inline void write(int x){
18     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
19     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
20     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
21 }
22 void init(){
23     p[0]=1;p[1]=2;p[2]=4;p[3]=6;p[4]=12;p[5]=24;p[6]=36;p[7]=48;p[8]=60;
24     p[9]=120;p[10]=180;p[11]=240;p[12]=360;p[13]=720;p[14]=840;p[15]=1260;p[16]=1680;p[17]=2520;p[18]=5040;
25     p[19]=7560;p[20]=10080;p[21]=15120;p[22]=20160;p[23]=25200;p[24]=27720;p[25]=45360;p[26]=50400;p[27]=55440;p[28]=83160;
26     p[29]=110880;p[30]=166320;p[31]=221760;p[32]=277200;p[33]=332640;p[34]=498960;p[35]=554400;p[36]=665280;p[37]=720720;p[38]=1081080;
27     p[39]=1441440;p[40]=2162160;p[41]=2882880;p[42]=3603600;p[43]=4324320;p[44]=6486480;p[45]=7207200;p[46]=8648640;p[47]=10810800;p[48]=14414400;
28     p[49]=17297280;
29     return;
30 }
31 void work(){
32     int n=read(),m=read();bool flag=false;
33     for(int i=0;i<50;i++){
34         if(n<=p[i]&&p[i]<=m){
35             if(flag)putchar(‘,‘);
36             else flag=true;
37             write(p[i]);
38         }
39     }
40     if(!flag)puts("NO");
41     return;
42 }
43 void print(){
44     return;
45 }
46 int main(){init();work();print();return 0;}
时间: 2024-08-03 07:18:09

COJ 0486 800401反质数的相关文章

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)的所有

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

反质数问题,求不大于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个

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 <i

反质数

问题描述 对于任何正整数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

【模板】【数学】反质数

题目链接: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 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 开始没有想清楚这

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