HDU 2204(容斥原理 數學)

2022-05-24 15:15:10 字數 1462 閱讀 4870

2015-05-14 19:35:28

題目:每次給出乙個n(n <= 10^18),讓你求出1~n中能表示成m^k的數的個數。

思路:比較明顯可以用容斥解的題目... 但是要注意細節。

首先,觀察 k 的最大值,2^60 > 10^18,所以 k < 60,所以我們可以列舉一下 k 的值。

對於每個 k,直接計算出最大可能的 m 值,那麼比 m 小的數都能作為底數。因為 m^k <= n,則 m^k <= n(m <= m)

m = pow(n,1.0/k)。顯然如果我們列舉的 k 不互質的話為產生重複(例:4^2 = 2^4),所以我們只列舉 60 以內的質數。

但是這樣依舊會有重複,比如 27^2 = 9^3,所以對與 k 為質數的情況,我們要容斥一下來計算。

prime[1] + prime[2] + ... + prime[m] - prime[1]^prime[2] - .... (prime[1]表示k=第乙個質數的答案數,prime[1]^prime[2]表示k=第1質數×第2質數的答案數)

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define getmid(l,r) ((l) + ((r) - (l)) / 2)

#define mp(a,b) make_pair(a,b)

#define pb(a) push_back(a)typedef

long

long

ll;typedef pair

pii;

const

double eps = 1e-8

;const

int inf = (1

<< 30) - 1

;ll ans,n,tmax[

100];

int prime[100],pcnt,check[100

];void

pre()

}void dfs(int p,int v,int

cnt)

if(v * prime[p] <= 60) dfs(p + 1,v * prime[p],cnt + 1

); dfs(p + 1

,v,cnt);

}int

main()

ans = 0

; dfs(

1,1,0

); printf(

"%lld\n

",ans + 1

); }

return0;

}

hdu 2204 容斥原理

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

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...