題意:
給定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...