# Number Theory# Prime Factorization# Brute Force

d366 - 00294 - Divisors

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出給定範圍 [a, b] 內,擁有最多除數的數字。如果有多個數字擁有相同的最大除數數量,則輸出最小的那個數字。

解題思路

程式碼透過迴圈迭代範圍 [a, b] 中的每個數字,並計算每個數字的除數數量。除數數量計算基於質因數分解。對於每個數字 j,程式碼嘗試找到其所有質因數,並計算每個質因數的冪次。除數的總數由質因數冪次的加一的乘積計算得出。程式碼追蹤目前找到的最大除數數量和對應的數字,並在迴圈結束時輸出結果。

複雜度分析

  • 時間複雜度: O(N * sqrt(B)),其中 N 是測試案例的數量,B 是範圍的最大值。對於每個數字,質因數分解的時間複雜度為 O(sqrt(j)),最壞情況下 j 等於 B。
  • 空間複雜度: O(1),程式碼只使用固定數量的變數,不依賴於輸入大小。

程式碼

#include <iostream>
#include <cmath>
using namespace std;
long long a,b,n;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	for(int i=0;i<n;++i){
		cin >> a >> b;
		long long ans,ma=0;
		for(long long j=a;j<=b;++j){
			long long tmp=j,ba=2,bat=1,trs=1;
			while(tmp!=1&&ba<=sqrt(tmp)){
				while(tmp%ba==0){
					tmp/=ba;
					++bat;
				}
				trs*=bat;
				bat=1;
				++ba;
			}
			if(tmp!=1){
				trs*=2;
			}
			if(trs>ma){
				ans=j;
				ma=trs;
			}
		}
		cout << "Between " << a << " and " << b << ", " << ans << " has a maximum of " << ma << " divisors.\n";  
	}
}

Discussion