時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 262144k,其他語言524288k
64bit io format: %lld
t次詢問,每次給你乙個數n,求在[1,n]內約數個數最多的數的約數個數
第一行乙個正整數t之後t行,每行乙個正整數n
輸出t行,每行乙個整數,表示答案
示例1
513911316
64166
對於100%的資料,t <= 500 , 1 <= n <= 1000000000000000000思路: 約數定理
約數定理:n可以分解質因數:n=p1^a1×p2^a2×p3^a3*…*pk^ak,
由約數定義可知p1^a1的約數有:p1^0, p1^1, p1^2......p1^a1 ,共(a1+1)個;同理p2^a2的約數有(a2+1)個......pk^ak的約數有(ak+1)個。
故根據乘法原理:n的約數的個數就是(a1+1)(a2+1)(a3+1)…(ak+1)。
約數和定理:
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)
若n可以分解質因數:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
可知p1^a1的約數有:p1^0, p1^1, p1^2......p1^a1
實際上n的約數是在p1^a1、p2^a2、...、pk^ak每乙個的約數中分別挑乙個相乘得來,
可知共有(a₁+1)(a₂+1)(a₃+1)…(ak+1)種挑法,即約數的個數。
由乘法原理可知它們的和為
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)
code:
#includeusing namespace std;
typedef long long ll;
const int a[20]=;
int t;
ll n,ans;
void dfs(int k,ll sum,ll ni,int m);
int main()
else break;
}
牛客網 n的約數 dfs
題目描述 戳這裡 解題思路 這題思路好想,n最多也就是20個不同的素數相乘,把所有可能的素數找到,然後列舉素數個數就行了。n p1 q1 p2 q2 p3 q3 pi qi 約數個數也好找,有個約數個數定理 對於乙個大於1正整數n可以分解質因數 則n的正約數的個數就是 其中a1 a2 a3 ak是p...
約數個數定理and約數和定理
定理 對於乙個大於1正整數n可以 分解質因數 則n的正約數 的個數就是 證明 省略 舉個栗子 例題 正整數378000共有多少個 正約數?解 將378000 分解質因數378000 2 4 3 3 5 3 7 1 由約數個數定理可知378000共有正約數 4 1 3 1 3 1 1 1 160個。c...
約數個數定理 約數和定理
1 如果我們要求乙個數的所有因數的個數會怎麼去求呢?首先想到最簡單的方法就是暴力求解就可以。當然資料小 或者測試資料少就很簡單就可以過了。2 如果求乙個區間內的數的所有因數的個數呢?或者求乙個區間內的數的因數最大的數以及最大的因數 正因數 的個數?這樣的話,資料大一些,組數多一些,可能就要tle,所...