因子個數的求法

求N的因子個數

分解質因數:
N= pow(p1,a1) * pow(p1,a2) *… * pow(pn,an);
p1~pn都是質數

N的因子個數M爲
M=(a1+1) * (a2+1) * …… *(an+1);

證明過程:

來自大佬
首先 舉個例子吧
24 = 2^3 * 3^1;
其質因子有:爲2和3 指數爲 3和1
那麼對於2 有0 1 2 3四種指數選擇,對於3 有0 1兩種指數選擇
所以 就是4 * 2 = 8 個因子個數
如果還是不懂,那麼我們就列舉出來吧
2 3
20*30=1 20*31=3
21*30=2 21*31=6
22*30=4 22*31=12
23*30=8 23*31=24

題目

蒜頭君對一個數的因數個數產生了興趣,他想知
道在1到n的範圍內,因數個數最多的數是多
少。如果有多個這樣的數,他想知道最小的那
個。
輸入格式
第一行一個整數T.表示數據的組數。
接下來T行,每行一個正整數n。
1≤T≤100,1≤n≤1016
輸出格式
-共輸出T行,每行-一個正整數表示最多因數
個數的數。
樣例輸入
10
1 00
1 000
樣例輸出
6
60
840

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int pri[1010]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
ll n,ans,maxx;
void dfs(int num,int po,ll x,ll y)//num是第num個質數,po是冪,x是因子個數、y是當前的數字
{
	if(x>maxx)//因子個數更大 
	{
		maxx=x;
		ans=y;
	}
	else if(x==maxx&&y<ans)ans=y;//因子個數相同且數更小
	if(num==15) return;//十五個質數就夠了 
	for(int i=1;i<=po;i++)
	{
		y*=pri[num];
		if(y>n)break;
		dfs(num+1,i,x*(i+1),y); 
	} 
} 
int main()
{
	int t;cin>>t;
	while(t--)
	{
		cin>>n;
		ans=0,maxx=0; 
		dfs(0,60,1,1);
		printf("%lld\n",ans);
	}
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章