HDU 2521 反素数

反素数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4238    Accepted Submission(s): 2456

Problem Description

反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。

Input

第一行输入n,接下来n行测试数据
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].

Output

输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.

Sample Input

3

2 3

1 10

47 359

Sample Output

2

6

240

这道题做了两次,第一次是没学数论的时候,然后学完数论又写了一次。

没学数论的时候,求一个数的约数,因为一个约数对应另一个约数,两个约数相乘即为该数,那么搜索时搜一半就行了,每搜到1个约数,总约数+2。

代码:

 1 #include <stdio.h>
 2 #include <math.h>
 3 main()
 4 {
 5     int n, t, sum, a, b, num;
 6     scanf("%d",&t);
 7     while(t--)
 8     {
 9         scanf("%d %d",&a,&b);
10         sum=0;
11         int max=0;
12         for(int i=a;i<=b;i++)
13         {
14             sum=0;
15             for(int j=1;j<sqrt(i);j++)
16             {
17                 if(i%j==0)
18                 sum+=2;
19             }
20             if(sqrt(i)*sqrt(i)==i)          //若该数位平方数,那么中间一个+1就行了,+2就重复了
21             sum++;
22             if(sum>max)
23             {max=sum;num=i;}
24         }
25         printf("%d\n",num);
26     }
27 }

学数论时候讲了个公式,一个数一定能这样表示:num=p1^e1*p2^e2*...*pn^en(p1....pn为该数的质因数),那么该数的约数总数sum=(1+e1)*(1+e2)*...*(1+en)。

那么这道题可以这样做了:
先把5000内的素数求出来,然后暴搜套公式答案就出来了。

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <vector>
 6 using namespace std;
 7
 8 int p[5005];
 9 int visited[5005];
10 int tot;
11
12 void init_p(){
13     int i, j;
14     tot=0;
15     memset(visited,0,sizeof(visited));
16     for(i=2;i<5005;i++){
17         if(!visited[i]) p[tot++]=i;
18         for(j=0;j<tot&&p[j]*i<5005;j++){
19             visited[p[j]*i]=1;
20             if(i%p[j]==0) break;
21         }
22     }
23 }
24
25 main()
26 {
27     int t;
28     int i, j, a, b;
29     int k, MIN, n, ans, kk;
30     cin>>t;
31     init_p();
32     while(t--){
33         scanf("%d %d",&a,&b);
34         MIN=-1;
35         for(i=a;i<=b;i++)
36         {
37             ans=1;n=i;
38             for(j=0;j<tot;j++){
39                 if(p[j]>i) break;
40                 k=0;
41                 while(n%p[j]==0){
42                     n/=p[j];
43                     k++;
44                 }
45                 ans*=1+k;
46             }
47             if(ans>MIN) {kk=i;MIN=ans;}
48         }
49         printf("%d\n",kk);
50     }
51 }

HDU 2521 反素数,布布扣,bubuko.com

时间: 2024-12-29 11:11:11

HDU 2521 反素数的相关文章

hdu 2521 反素数(打表)

反素数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5723    Accepted Submission(s): 3355 Problem Description 反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使

HDOJ(HDU) 2521 反素数(因子个数~)

Problem Description 反素数就是满足对于任意i(0< i < x),都有g(i) < g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大. Input 第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b]. Output 输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数. Sample Input 3 2 3

ZOJ 2562 HDU 4228 反素数

反素数: 对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4. 如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数. ZOJ 2562 反素数 因为写了POJ 2886的线段树,然后里面有反素数,以前没遇到过,所以先搞这两题普及一下知识再说. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&

HDU ACM 2521 反素数 水题+因子打表

分析:水题,不解释. #include<iostream> using namespace std; int cnt[6000]; void init() //打表 { int i,j; memset(cnt,0,sizeof(cnt)); cnt[1]=1; //1只有他本身 for(i=2;i<=5005;i++) { cnt[i]+=2; //1和他本身 for(j=2;j<=i/2;j++) if(i%j==0) cnt[i]++; } } int main() { int

HDU 4228 Flooring Tiles 反素数

推出了结论,万万没想到最后用搜索.. 还想dp来着.. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map> using namespace std; #define ll lon

HDU 4228 Flooring Tiles 反素数的应用

给你一个数N,找出一个最小的可以拆分成N种乘积表达形式的数x 比如N=2,6可以拆成2x3或者1x6两种,但不是最小的,最小的是4可以拆成1x4,2x2两种 首先可以肯定的是x必然有N*2或者是N*2-1(完全平方的情况)个约数 利用求反素数的过程求出约数为N*2和N*2-1个的最小的数 #include <cstdio> #include <sstream> #include <fstream> #include <cstring> #include &l

HDU 4133 StrangeStandard 反素数

题目链接:点击打开链接 反素数:点击打开链接 爆搜幂即可. #include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #include <stack> #include

hdu 4542 &quot;小明系列故事——未知剩余系&quot; (反素数+DFS剪枝)

传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = 0,求[1,262]中的因子个数为 k 的反素数,如果求解的答案 > 262,输出"INF": ②type = 1,求使得 num-factor[num] = k 的最小的num: 题解: 只有当 type = 1 时,才有可能输出 "Illegal": 那,什么

反素数 -- 数学

反素数就是区间内约数个数最多的那个数. 在ACM题目里, 一般是求约数最多而且数字最小的那个数,[1--n] 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数[beign,end] 1和3有区别吗?有,1可以加速,3只能暴力 先说下思路 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. (2)我们可以知道,计算约数的个数和质因数分解有着很大的联系: 若Q的质因数分解为:Q=p1^k1*p2^k2*…*pm^km(p1…pm为素数,k1…km≥1),则Q有(k1+1