日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 2440 完全平方数(莫比乌斯-容斥原理)

發布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 2440 完全平方数(莫比乌斯-容斥原理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://61.187.179.132/JudgeOnline/problem.php?id=2440

題意:給定K。求不是完全平方數(這里1不算完全平方數)的倍數的數字組成的數字集合S中第K小的數字是多少?

思路:首先,答案不超過2K,這個我看別人的知道的,我本以為答案會很大。。這樣二分就比較顯然了。二分之后就是判斷可行性。也就是求二分值n之內有多少個集合S中的數字。此時,我們可以反著想,就是計算有多少個數字不是S集合中的,也就是是完全平方數倍數的數字的個數。這個用容斥原理:

(1)加上一個的:n/4+n/9+n/25+……;

(2)減去兩個的:n/36+n/100+……;

就是這樣,但是這個容斥看起來我覺得復雜付還是蠻大的。下面說莫比烏斯函數:

利用莫比烏斯函數,我們直接求n之內有多少個是S集合中的:

?



int mou[N];


void init()
{
? ? i64 i,j;
? ? for(i=2;i<N;i++) if(!mou[i])
? ? {
? ? ? ? mou[i]=i;
? ? ? ? for(j=i*i;j<N;j+=i) mou[j]=i;
? ? }
? ? mou[1]=1;
? ? for(i=2;i<N;i++)
? ? {
? ? ? ? if(i%(mou[i]*mou[i])==0) mou[i]=0;
? ? ? ? else mou[i]=-mou[i/mou[i]];
? ? }
}


i64 n;


i64 cal(i64 n)
{
? ? i64 ans=0,i;
? ? for(i=1;i*i<=n;i++) if(mou[i]) ans+=mou[i]*n/i/i;
? ? return ans;
}


int main()
{
? ? init();
? ? rush()
? ? {
? ? ? ? RD(n);
? ? ? ? i64 low=1,high=inf,mid,ans;
? ? ? ? while(low<=high)
? ? ? ? {
? ? ? ? ? ? mid=(low+high)>>1;
? ? ? ? ? ? if(cal(mid)>=n) ans=mid,high=mid-1;
? ? ? ? ? ? else low=mid+1;
? ? ? ? }
? ? ? ? PR(ans);
? ? }
}

總結

以上是生活随笔為你收集整理的BZOJ 2440 完全平方数(莫比乌斯-容斥原理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。