1. 程式人生 > >Divisors(唯一分解)

Divisors(唯一分解)

給出一個區間,問其中哪個數因子最多。對每個數進行唯一分解,然後求出素因子乘積即為因子個數。

#include <cstdio>
using namespace std;
const int maxn = 34000;
int prime[maxn],p;
bool np[maxn]={true,true};
void pre() {
    for(int i = 2; i < maxn; ++i) {
        if(!np[i]) prime[p++] = i;
        for(int j = 0; j < p && i * prime[j] < maxn; ++j) {
            np[i * prime[j]] = true
; if(!(i % prime[j])) break; } } return; } int solve(int n) { int cur = 1; for(int i = 0; i < p; ++i) { int cnt=1; if(n % prime[i] == 0) { while(n % prime[i] == 0 && n) n /= prime[i], ++cnt; cur *= cnt; } } return
cur; } int main() { pre(); int t; scanf("%d", &t); while(t--) { int l, r; scanf("%d%d", &l, &r); int max_n = 0, ans = l; for(int i = l; i <= r; ++i) { int k=solve(i); if(k > max_n) max_n = k,ans =i; } printf
("Between %d and %d, %d has a maximum of %d divisors.\n", l, r, ans, max_n); } return 0; }