BZOJ2240 完全平方数
生活随笔
收集整理的這篇文章主要介紹了
BZOJ2240 完全平方数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
小 X 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而這絲毫不影響他對其他數的熱愛。
這天是小X的生日,小 W 想送一個數給他作為生日禮物。當然他不能送一個小X討厭的數。他列出了所有小X不討厭的數,然后選取了第 K個數送給了小X。小X很開心地收下了。
然而現在小 W 卻記不起送給小X的是哪個數了。你能幫他一下嗎?Input
包含多組測試數據。文件第一行有一個整數 T,表示測試數據的組數。
第2 至第T+1 行每行有一個整數Ki,描述一組數據,含義如題目中所描述。 Output
含T 行,分別對每組數據作出回答。第 i 行輸出相應的第Ki 個不是完全平方數的正整數倍的數。Sample Input
4
1
13
100
1234567
Sample Output
1
19
163
2030745
HINT
對于 100%的數據有 1 ≤ Ki ≤ 10^9, T ≤ 50本題要求第k個沒有平方因子的數,直接二分答案,然后判斷區間內的數的數量是否可行。因為沒有平方因子就意味著μ(i)!=0,所以我們二分出了一個n之后,就計算區間的答案,根據容斥原理,滿足要求的ans=n-只有一個質數因子次數大于等于2的個數+只有2個質數因子大于等于2的個數-...
每次check時間復雜度為O(√n)Code:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=100005;
const long long inf=(1ll<<31)-1;
long long l,r;
int t,mobius[N],k,prime[N],len,ans;
bool ok[N];
bool check(long long x){long long div=sqrt(x);int tot=0;for(int i=1;i<=div;i++) {tot+=mobius[i] * (x/(i*i));}if(tot>=k){return 1;}return 0;
}
int main(){mobius[1]=1;for(int i=2;i<=N;i++) {if(!ok[i]){prime[++len]=i;mobius[i]=-1;}for(int j=1;j<=len&& prime[j]*i<=N;j++) {ok[i*prime[j]]=1;if(i%prime[j]!=0){mobius[i*prime[j]]=-mobius[i];}else{mobius[i*prime[j]]=0;break;}}}scanf("%d",&t);long long mid;while(t--){scanf("%d",&k);l=1,r=inf;ans=inf;while(l<=r) {mid=(l+r)/2;if(check(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}printf("%d\n",ans);}return 0;
}
轉載于:https://www.cnblogs.com/ukcxrtjr/p/11311042.html
總結
以上是生活随笔為你收集整理的BZOJ2240 完全平方数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Easy) FizzBuzz Leet
- 下一篇: P4213 【模板】杜教筛