UVA294DIvisors(唯一分解定理+约数个数)

题目链接

题意:输入两个整数L,U(L <= U <= 1000000000, u - l <= 10000),统计区间【L,U】的整数中哪一个的正约数最多,多个输出最小的那个

本来想着用欧拉函数,打个表求所有的约数个数,但是u太大,直接暴力求解

利用唯一分解定理,刷选出根号1000000000的素数,对l,u区间的每一个数进行分解

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 const int Max = 34000;
 7 int prime[Max + 5],total,flag[Max];
 8 void get_prime()
 9 {
10     total = 0;
11     for(int i = 2; i <= Max; i++)
12     {
13         if(flag[i] == 0)
14         {
15             prime[++total] = i;
16             for(int j = i; j <= Max / i; j++)
17             {
18                 flag[i * j] = 1;
19             }
20         }
21     }
22 }
23 int get_gcd(int n)
24 {
25     int num = 0,ans = 1;
26     for(int i = 1; i <= total; i++)
27     {
28         if(prime[i] > n)
29             break;
30         if(n % prime[i] == 0)
31         {
32             num = 0;
33             while(n % prime[i] == 0)
34             {
35                 num++;
36                 n = n / prime[i];
37             }
38             ans *= (num + 1);
39         }
40     }
41     if(n > 1)
42     {
43         ans *= 2;
44     }
45     return ans;
46 }
47 int main()
48 {
49     int l,u,test;
50     get_prime();
51     scanf("%d", &test);
52     while(test--)
53     {
54         scanf("%d%d", &l, &u);
55         int temp;
56         int maxn = 0, p;
57         for(int i = l; i <= u; i++)
58         {
59             temp = get_gcd(i);
60             if(temp > maxn)
61             {
62                 maxn = temp;
63                 p = i;
64             }
65         }
66         printf("Between %d and %d, %d has a maximum of %d divisors.\n", l, u, p, maxn);
67     }
68     return 0;
69 }

时间: 2024-07-28 20:39:36

UVA294DIvisors(唯一分解定理+约数个数)的相关文章

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1845 Appoint description:  System Crawler  (2015-05-27) Description Consider two natural numbers A and B. Let S be the sum of all natural d

hdu 1215 求约数和 唯一分解定理的基本运用

http://acm.hdu.edu.cn/showproblem.php?pid=1215 题意:求解小于n的所有因子和 利用数论的唯一分解定理. 若n = p1^e1 * p2^e2 * --*pn^en(任何一个数都可以分解成素数乘积) 则n的因子个数为  (1+e1)(1+e2)--(1+en) n的各个因子的和为(1+p1+p1^2+--+p1^e1)(1+p2+p2^2+--+p2^e2)--(1+pn+pn^2+--+pn^en) (把式子化简就知道为什么了) ac代码: #inc

NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数.现 在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整 数 x 满足: 1. x 和 a0 的最大公约

唯一分解定理证明(WD)

from http://www.matrix67.com/blog/archives/495 为什么质因数分解的方法是唯一的.这个结论是如此的显然和易于接受,以致于有人会脱口而出:这当然是唯一的,不断使用越来越大的质数去试除,最后得到的肯定是唯一的质因数分解.不可否认,这个算法本身是没有任何问题的.根据合数的定义,试除与分解是一定能不断进行下去的,除非被除数本身变成了一个质数,而此时也标志着算法的结束.问题的关键就在于,这并不能说明原数能唯一地表示成质数的乘积:换一种试除的顺序会不会得出不同的分

唯一分解定理的应用: NOIP2009 提高组第二题Hankson [唯一分解定理|暴力]

输入输出格式 输入格式: 第一行为一个正整数 n,表示有 n 组输入数据.接下来的 n 行每 行一组输入数据,为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开.输入 数据保证 a0 能被 a1 整除,b1 能被 b0 整除. 输出格式: 输出文件 son.out 共 n 行.每组输入数据的输出结果占一行,为一个整数. 对于每组数据:若不存在这样的 x,请输出 0: 若存在这样的 x,请输出满足条件的 x 的个数: 输入输出样例 输入样例#1: 2 41 1 96 288 95

Aladdin and the Flying Carpet(唯一分解定理)

题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况: 首先了解唯一分解定理: 题目思路:根据唯一分解定理有: 1.每个数n都能被分解为:n=p1^a1*p2^a2*^p3^a3--pn^an(p为素数); 2.n的正因数的个数sum为:sum=(1+a1)*(1+a2)*(1+a3)--(1+an); 最短边为m,若m>=sqrt(n),则无解.所以m最多我10^6,可遍历找出1-m中n的因子,并用sum去减去这类因子

唯一分解定理入门

唯一分解定理:每一个大于1的正整数均可分解为有限个素数的积,如果不计素因数在乘积中的次序,则分解方式是唯一的.将n的素因数分解中相同的素因子收集到一起,可只每个大于1的正整数n可唯一地写成    n = p1a1p2a2p3a3...pkak,其中,p1,p2,p3,...,pk ,是互不相同的素数,而a1,a2,a3,...,ak 是正整数,上面的分解式称为n的标准分解. 性质:n的正约数个数,τ(n) = (1+a1)(1+a2)(1+a3)......(1+ak) :n的正约数之和,σ(n

HDU 1452 Happy 2004(唯一分解定理)

题目链接:传送门 题意: 求2004^x的所有约数的和. 分析: 由唯一分解定理可知 x=p1^a1*p2^a2*...*pn^an 那么其约数和 sum = (p1^0+p1^1^-+p1^a1)*-* (pn^0+pn^1^-+pn ) 代码如下: #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const

Coderforce-574C Bear and Poker(素数唯一分解定理)

题目大意:给出n个数,问能不能通过让所有的数都乘以2的任意幂或乘以3的任意幂,使这n个数全都相等. 题目分析:最终n个数都是相等的,假设那个数为x,根据素数唯一分解定理,x能分解成m*2p3q.所以,只需将所有的a[i]一直除以2并且一直除以3,最终只需判断这n个数是否全部相等即可. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include