感覺斷斷續續的看了好久的容斥……然後還是看不懂莫比烏斯反演……以後基本原理懂了就先上手做題吧,不然感覺還是不會還浪費時間…………
第一題容斥…………
題意:給你乙個數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,直接計算出最大可能的...