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
≤ 109
, t
≤ 50
source
突然想起來了就去刷了個數論。
其實這是我在某個莫比烏斯反演的ppt裡看到的,但是這個題不是反演只是個莫比烏斯函式的應用。
具體做法是二分答案。
只需要乙個小小的check函式來判斷當前二分到的答案是否比k大或小即可。
手動模擬了一下發現某個規律
對於乙個數t,t以內的數里的非完全平方數倍數的個數 nu
m=1的
倍數的數
量−乙個
質數平方
數(9,
25,49...)的
倍數的數
量+兩個
質數的積
平方數(
36,100,
225...)的
數量−三
個質數b
alab
ala
所以上面那個規律正好可以用莫比烏斯函式來搞。 比如μ
(3)=
−1,μ
(6)=
1...
所以答案an
s=∑x
√i=1
μ(i)
⌊xi2
⌋ 二分時候出了點奇怪的問題。。。(這個題的二分姿勢有點奇怪而且l+r會爆int)所以最後去膜拜了一下那個ppt原作者popoqqq的**拿來對拍。。。直到最後發現了問題改了過來=ω
= (別罵我qaq)
#include
#include
#include
#include
#include
#define maxn 100000
using
namespace
std;
int t;
int k;
bool not_prime[maxn];
int prime[maxn];
int num;
int mu[maxn];
void choose_prime()
}}void mob()
else
mu[i*prime[j]]=-mu[i];}}
}int check(long
long t)
int main()
}if (k==1) cout
<<1
printf("%d\n",ans);
}}
BZOJ 2440 完全平方數
time limit 10 sec memory limit 128 mb submit 966 solved 457 submit status 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而 這絲毫不影...
BZOJ 2440 完全平方數
求第k個無平方因子的數 無平方因子數,即分解質因數後所有質因數的次數都為1的數.首先轉化為判定性問題,即1 n中有多少個數為無平方因子數 二分答案.根據容斥原理可得 n以內的無平方因子數 0個質數乘積的平方的倍數的數的個數 即n 1個質數乘積的平方的倍數的數的個數 如4的倍數,9的倍數 2個質數乘積...
BZOJ 2440 完全平方數
time limit 10 sec memory limit 128 mb submit 966 solved 457 submit status 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而 這絲毫不影...