hdu2204 Eddy s愛好(容斥)

2021-10-09 05:50:34 字數 1390 閱讀 7328

題意:

給定n,問有多少個p=m^k,滿足p<=n(要求m>=1,k>1)

資料範圍:n<=1e18

解法:

顯然列舉m肯定不行,因為m^

2<=

1e18

,那麼m<=

1e9,

考慮列舉k,2^

60>

1e18

,因此列舉k最多列舉60個,

如果k是乙個合數,那麼k可以拆分為乙個數與質數的乘積:k=x*p,

那麼m^k可以變為m^

(x*p)

=(m^x)

^p,因此k只需要列舉質數即可

x^p<=n,那麼(x-1)

^p也一定<=n,因此x的數量為n^(1

/p),累加至答案即可

但是這樣會有重複,例如(x^3)

^5和(x^5)

^3,所以但需要減去x^(3

*5)最後的式子應該是cal

(x^p1)

+cal

(x^p2)

-cal

(x^(p1*p2))+

cal(..

.)即加上指數為乙個指數的,減掉指數有兩個質數的,然後還要再加回指數有3個指數的.

理論上還要減掉4個指數,加上5個指數...

但是2*3*

5*7>

60,因此指數的質數個數不超過3

,最多容斥到3個質數

ps:m=

1的情況單獨考慮,容斥的時候不計算m=

1的情況,最後答案再加上1

參考:https:

51908666

code:
#include

using

namespace std;

#define int long long

const

int maxm=65;

const

double eps=

1e-8

;int prime[maxm]

,cnt;

int n;

int ans;

intisprime

(int x)

return1;

}void

init()

}}void

dfs(

int cur,

int sum,

int num)

dfs(cur+

1,sum,num)

;//當前素數不選

dfs(cur+

1,sum*prime[cur]

,num+1)

;//當前素數選

}signed

main()

return0;

}

hdu 2204 Eddy s愛好 容斥

根據指數的質數分解進行容斥 比如 k a 3 且 k b 5,那麼 k c 15 所以 a 的可選個數 加 b的可選個數減去c的可減個數就是總的個數了因為 a 3和b 5有重複的 include include include include include include define ll lo...

HDU 2204 Eddy s愛好 容斥

ignatius 喜歡收集蝴蝶標本和郵票,但是eddy的愛好很特別,他對數字比較感興趣,他曾經一度沉迷於素數,而現在他對於一些新的特殊數比較有興趣。這些特殊數是這樣的 這些數都能表示成m k,m和k是正整數且k 1。正當他再度沉迷的時候,他發現不知道什麼時候才能知道這樣的數字的數量,因此他又求助於你...

HDU 2204 Eddy s愛好 容斥

input 本題有多組測試資料,每組包含乙個整數n,1 n 1000000000000000000 10 18 output 對於每組輸入,請輸出在在1到n之間形式如m k的數的總數。每組輸出佔一行。sample input 10 361000000000000000000sample output...