求乙個數的因子數其實不必列舉1~n 的所有數,比如我求12的所有因子,我列舉到1時,12可以被1整除,同時我就可以知道另乙個數12也是他的因子,同理我列舉到2時,12可以被2整除,另乙個數6也可同時求出……即我們只需列舉到3就可以求出所有的因子了。可以發現,求n的所有因子數,我們只需要列舉到sqrt(n)即可。**如下:
int
query
(int n)
}return ans;
}
唯一分解定理:任何乙個正整數都可以素因子分解為
n = p1 e1 * p2e2 * … * prer; (其中pr是< n 的素數因子)
n的因子個數為:(e1+1)* (e2+1) * ……* (er+1)
因為(ab)2=a2
b2 同理可得:
n2 的因子數為:(2 * e1+1) (2 * e2+1) * …… (2 * er+1)
此外埃氏篩法時間複雜度為o(n log(log n))。
步驟:我們先篩選出sqrt(n)內的素數,然後對n進行素因子分解即可求出n2 的因子數,此方法適用於n比較大時。
需要注意的是:當你輸入的n本身就是乙個大於你所求的長度的素數,他當然不能被0~sqrt(n)的素因子整除,它的素因式分解就是它本身,或者n有兩個因子,乙個在素數表裡,另乙個在sqrt(n)外,故最後要特判一下,如果是那麼n的因子數要再乘以1*(2*1+1)=3!
模板(有詳細注釋)[下面]:
hud1299
主要就是你輸入n,求出n2 的因子數,然後進行進一步求解答案。
其中1<= n <=109,這個資料再來個平方就是1018 是無法用方法一暴力列舉的!
#include
#include
#include
#include
#include
using namespace std;
#define ll long long int
#define max_size 40005
int prime[max_size]
;//裝素數
bool is_prime[max_size]
;//是否素數
intis_prime
(int n)
}return c;
//返回素數的個數
}int
main
(void
) i++
; ans*=(
2*e+1)
;}//ans為n^2的因子數
//printf("%d\n",ans);
if(n>
1) ans*=(
2*1+
1);//別忘了
//此時i==c 即此時的n本身就是乙個大於max_size=40005的素數,沒有乙個數能整除他
printf
("scenario #%d:\n"
,++k);if
(ans%2==
1)printf
("%d\n\n"
,ans/2+
1);else
printf
("%d\n\n"
,ans/2)
;}return0;
}
補充:其實**中素因式子分解過程中,我們也可以不用先通過埃氏篩處理出前sqrt(n)的素數,直接列舉也可以的:
typedef long long ll;
ll get_num(ll x)
}if(x>1)ans*=3;
return ans;
}
如果是多測試並且n比較大是,還是要用先處理出素數表,再對n進行素因子分解比較快。如果是單測試用例,就用此方法,直接sqrt(n)列舉每乙個素因子出來。
你能確保每次整數除的i就是素數?
還真是,怎麼證明呢?比如12的素因子有2(2*6),3(3 *4)。
12=2x2x3.
12%2=0;12/2/2=3;3%3=0;
還是要看素因子分解定理,故「 完全篩去 i 因子(i的k次冪)」。不會組織語言,關鍵還是素因子分解定理:n = p1 e1 * p2e2 * … * prer; (其中pr是< n 的素因子)。
再舉個例子,30的素因子為2,3,5。一共有8個因子:1,2,3,5,6,10,15,30。
30/2=15(2是素因子);15%3=0(3是素因子),15/3=5;5%4!=0(4不是素因子);5%5=0(5是素因子);
30=21x31x51 ;
找乙個數的因子個數,因子和
1.所有因子個數 如果乙個數是因數,就不斷除這個數,儲存這個因子次方的數 temp 運用所有因子個數計算公式 見上圖 儲存因子個數的 ans不斷乘 temp 1 注意 當最後,在 x 不斷除因數得到的值有兩種情況 x 1,這說明 x 沒有其他因子了。x 1,這時 x 為其乙個素數因子 且這個因子大於...
求n以內的所有因子數
在網上搜到的都是些求質因子的,剛好今天遇到一道題,題目思路錯了,就碼了乙個求乙個數所有因子的模板。再根據公式n p1 x1 p2 x2 pm xm,pi表示質因子數,xi表示其指數,從而可以看出n的所有因子都是可以通過質因子組合而來,並且有n的因子個數等於 x1 1 x2 1 xm 1 所以該模板的...
求乙個數的因子數及平方數判斷
對於乙個自然數n,都可以分解質因子得到如下形式 怎麼推出來的我也不知道。其中因子數包含自身和1 注意,若要使f n 為奇數,僅有一種可能,就是e1,e2.都為偶數時,總的因子數才為奇數,而若指數都為偶數,說明這個數必定是乙個完全平方數!判斷乙個數是否為平方數 根據數學的等差數列求和公式 由此可知 任...