hdu 2204 容斥原理

2021-06-27 14:33:02 字數 691 閱讀 5852

感覺斷斷續續的看了好久的容斥……然後還是看不懂莫比烏斯反演……以後基本原理懂了就先上手做題吧,不然感覺還是不會還浪費時間…………

第一題容斥…………

題意:給你乙個數n[1,10^18],叫你求n內有多少個數是m^k得來的。

可知:m^k都可以變成乙個冪數為素數的形式,所以可以列舉素數,求每個素數滿足的個數。因為存在 形如 x^3=y^5 ,的重疊部分,所以這裡用容斥原理,因為2^60>10^18,且2*3*5*7>60,則只需要列舉三個數內的容斥即可。

注意處理精度的小tip

#include #include #include #include #define ll __int64

using namespace std;

ll prime[65],que[50];

#define eps 1e-12

ll top;

void getprime()

for(i=2;i<65;i++)

if(prime[i]) que[top++]=i;

}int main()

{ ll n;

top=0;

getprime();

while(scanf("%i64d",&n)!=eof)

{ll i,j,k;

ll tmp;

ll ans=1;

for(i=0;i

HDU 2204(容斥原理)

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

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,直接計算出最大可能的...