1. 程式人生 > >【BZOJ】2440: [中山市選2011]完全平方數

【BZOJ】2440: [中山市選2011]完全平方數

無平方因子數 style aps 就是 lld spa col names play

【題意】T次詢問第k小的非完全平方數倍數的數。T<=50,k<=10^9。(即無平方因子數——素因數指數皆為0或1的數)

【算法】數論(莫比烏斯函數)

【題解】考慮二分,轉化為詢問[1,x]中無平方因子數的個數(x最大為2n)。

運用容斥,答案ans=x - 1個素數的平方的倍數的數的個數 + 2個素數的乘積的平方的倍數的數的個數……

枚舉i=[1,√x]的所有數字,系數是莫比烏斯函數,i的平方的倍數的數的個數就是n/(i^2)。

ans=x-Σμ(i)*n/(i^2),i∈[1,√x]

復雜度O(T*√n)。

技術分享圖片
#include<cstdio>
#include<cmath>
#include
<algorithm> using namespace std; const int maxn=50010; int T,tot,n,miu[maxn],prime[maxn]; bool mark[maxn]; int main(){ scanf("%d",&T); miu[1]=1; for(int i=2;i<=50000;i++){ if(!mark[i]){prime[++tot]=i;miu[i]=-1;} for(int j=1;j<=tot&&i*prime[j]<=50000;j++){ mark[i
*prime[j]]=1; if(i%prime[j]==0)break; miu[i*prime[j]]=-miu[i]; } } while(T--){ scanf("%d",&n); long long l=0,r=2*n,mid,ans;// while(l<r){ mid=(l+r)>>1;ans=0;int sq=(int)sqrt(mid); for(int i=1;i<=sq;i++){ ans
+=miu[i]*mid/i/i; } if(ans>=n)r=mid;else l=mid+1; } printf("%lld\n",l); } return 0; }
View Code

【BZOJ】2440: [中山市選2011]完全平方數