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