HDU 2204(容斥原理)

2021-08-25 06:06:40 字數 951 閱讀 8261

input

本題有多組測試資料,每組包含乙個整數n,1<=n<=1000000000000000000(10^18). 

output

對於每組輸入,請輸出在在1到n之間形式如m^k的數的總數。 

每組輸出佔一行。 

sample input

10

361000000000000000000

sample output

4

91001003332

首先需要知道乙個結論:在乙個區間[1,n]中,能被開平方的數一共有因為我們要求的是1到n間的可以構成m^k這種形式的數,我們上述的結論直接列舉每乙個k進行求解。同時,我們可以發現,倘若k能夠被質因數分解(k不是質數),則我們分解後的結果必定是兩個質數的冪,而這兩個質數的結果我們在之前必定也是統計過了的,因此對於k,我們只需要列舉質數即可。

觀察資料範圍可知,倘若底數為2,則要達到1e18,k最多達60即可,即我們只需要篩出[2,60]之間的質數即可。

然而這麼做的話顯然我們在某些情況下是計重了的,此時我們就需要用到萬能的容斥原理啦。同時我們可以看出

ps:這個題在進行pow操作的時候,在將pow的double型別轉化成longlong型別的時候,需要多加乙個1e-8的常數,否則答案會出現一定偏差。

#include #define maxn 40

using namespace std;

typedef long long ll;

vectorisprime;

const double eps=1e-8;

bool check(ll x)

return 1;

}void init()

}int main()}}

cout<}}

hdu 2204 容斥原理

感覺斷斷續續的看了好久的容斥 然後還是看不懂莫比烏斯反演 以後基本原理懂了就先上手做題吧,不然感覺還是不會還浪費時間 第一題容斥 題意 給你乙個數n 1,10 18 叫你求n內有多少個數是m k得來的。可知 m k都可以變成乙個冪數為素數的形式,所以可以列舉素數,求每個素數滿足的個數。因為存在 形如...

hdu2204 容斥原理)

容斥原理 設a ia i ai 為集合,ai a i ai 為集合大小 則 a1 a2 a3 a 4 an a 1 cup a 2 cup a 3 cup a 4 cdots a n a1 a 2 a 3 a 4 a n i 1n ai i 1 n j i 1n ai aj i 1 n j i 1n...

HDU 2204(容斥原理 數學)

2015 05 14 19 35 28 題目 每次給出乙個n n 10 18 讓你求出1 n中能表示成m k的數的個數。思路 比較明顯可以用容斥解的題目.但是要注意細節。首先,觀察 k 的最大值,2 60 10 18,所以 k 60,所以我們可以列舉一下 k 的值。對於每個 k,直接計算出最大可能的...