UVA - 294 Divisors (约数)(数论)

题意:输入两个整数L,U(1<=L<=U<=109,U-L<=10000),统计区间[L,U]的整数中哪一个的正约数最多。如果有多个,输出最小值。

分析:

1、求一个数的约数,相当于分解质因子。

2、例如60 = 2 * 2 * 3 * 5。对于2来说,可选0个2,1个2,2个2,有3种情况,同理对于3,有2种情况,对于5,有2种情况,所以3 * 2 * 2则为60的约数个数。

3、L到U扫一遍,取最大值即可。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b) {
    if(fabs(a - b) < eps)  return 0;
    return a < b ? -1 : 1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 35000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int vis[MAXN];
vector<int> prime;
void init(){
    for(int i = 2; i < MAXN; ++i){
        if(!vis[i]){
            prime.push_back(i);
            for(int j = 2 * i; j < MAXN; j += i){
                vis[j] = 1;
            }
        }
    }
}
int cal(int n){
    int ans = 1;
    int len = prime.size();
    for(int i = 0; i < len; ++i){
        if(prime[i] > n) break;
        if(n % prime[i]) continue;
        int cnt = 1;
        while(n % prime[i] == 0){
            ++cnt;
            n /= prime[i];
        }
        ans *= cnt;
    }
    return ans;
}
int main(){
    init();
    int T;
    scanf("%d", &T);
    while(T--){
        int l, r;
        scanf("%d%d", &l, &r);
        int ans = 0;
        int id;
        for(int i = l; i <= r; ++i){
            int tmp = cal(i);
            if(tmp > ans){
                ans = tmp;
                id = i;
            }
        }
        printf("Between %d and %d, %d has a maximum of %d divisors.\n", l, r, id, ans);
    }
    return 0;
}

  

时间: 2024-09-29 22:09:29

UVA - 294 Divisors (约数)(数论)的相关文章

uva 294 - Divisors(枚举+计数)

题目连接:uva 294 - Divisors 题目大意:给出一个范围L~U,问说在该范围中因子数最多的数是多少. 解题思路:枚举L~U中的数,将数分解成质因子,利用乘法原理求总因子数. #include <cstdio> #include <cstring> #include <cmath> int countFactor (int x) { int ans = 1; int m = sqrt(x+0.5); for (int i = 2; i <= m; i+

UVA 294 Divisors( 因子分解)

294 DivisorsMathematicians love all sorts of odd properties of numbers. For instance, they consider 945 to be aninteresting number, since it is the rst odd number for which the sum of its divisors is larger than thenumber itself.To help them search f

UVa 294 - Divisors

计算一个给定区间中因数最多的数. 分析:数论.组合数学.题目的数据的比较大,如果暴力一定会超时,那么就考虑利用其他方法求解. 我们将给定数字因式分解,那么因数的个数就是π(各质因子数+1).(每个质因子取0~上限个) 因为数据时在10^9之内,所以质因数只能是33333以内的素数,利用筛法将素数打表计算即可. #include <iostream> #include <cstdlib> using namespace std; int visit[34000]; int prime

UVA 294 求约数的个数

#include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<vector> #include<stdlib.h> #include<algorithm> using namespace

UVA 294 - Divisors 因子个数

Mathematicians love all sorts of odd properties of numbers. For instance, they consider 945 to be an interesting number, since it is the first odd number for which the sum of its divisors is larger than the number itself. To help them search for inte

UVA 294 294 - Divisors (数论)

UVA 294 - Divisors 题目链接 题意:求一个区间内,因子最多的数字. 思路:因为区间保证最多1W个数字,因子能够遍历区间.然后利用事先筛出的素数求出质因子,之后因子个数为全部(质因子的个数+1)的积 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 35005; int prime[N], pn = 0, v

hdoj 1492 The number of divisors(约数) about Humble Numbers 【数论】【质因子分解 求和】

定理:一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的个数就是,(r1+1)*(r2+1)*...*(rk+1). 理解:为什么是加1之后再相乘,因为一个数的的因子数至少为1和他自身,但因为r1,r2..可以为0,所以因子的个数为(r1+1)... 拓展一下: 定理1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的

HDU 1492 The number of divisors(约数) about Humble Numbers 数论

The number of divisors(约数) about Humble Numbers Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8,

uva 10560 - Minimum Weight(数论)

题目连接:uva 10560 - Minimum Weight 题目大意:给出n,问说至少需要多少个不同重量的砝码才能称量1~n德重量,给出所选的砝码重量,并且给出k,表示有k个重量需要用上述所选的砝码测量. 解题思路:重量为1的砝码肯定要选,它可以表示到1的重量,那么下一个砝码的重量肯定选择3(2?1+1),这样1,3分别可以用一个砝码表示,而2,4分别为3-1和3+1,这样1~4的重量也都可以表示.于是有公式ai=si?1?2+1. #include <cstdio> #include &