time limit: 10 sec memory limit: 128 mb
submit: 4458 solved: 2153
[submit][status][discuss]
小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些
數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而
這絲毫不影響他對其他數的熱愛。
這天是小x的生日,小 w 想送乙個數給他作為生日禮物。當然他不能送一
個小x討厭的數。他列出了所有小x不討厭的數,然後選取了第 k個數送給了
小x。小x很開心地收下了。
然而現在小 w 卻記不起送給小x的是哪個數了。你能幫他一下嗎?
包含多組測試資料。檔案第一行有乙個整數 t,表示測試
資料的組數。
第2 至第t+1 行每行有乙個整數ki,描述一組資料,含義如題目中所描述。
含t 行,分別對每組資料作出回答。第 i 行輸出相應的
第ki 個不是完全平方數的正整數倍的數。
4 1
13 100
1234567
1 19
163
2030745
對於 100%的資料有 1 ≤ ki ≤ 10^9
, t ≤ 50
分析:涉及到求第k個,常見的套路是二分,求出[1,x]有多少個數是無平方因子數.直接統計效率實在是太低,但是涉及到倍數的計數題往往都可以用容斥原理來做,即用區間的數的個數-乙個質數的平方的倍數的個數+2個質數的乘積的平方的倍數-3個質數的乘積的平方的倍數......很快可以發現這個-和+是有規律的,正好就相當於莫比烏斯函式μ(x).只需要看乙個數對區間的貢獻是多少,最後累加起來.那麼列舉[1,sqrt(x)]的數,對於每乙個數y,通過莫比烏斯函式就能夠知道它對區間的貢獻到底是正的還是負的.再把y平方一下,看有多少個數是y^2的倍數,就能進行容斥原理了.
#include #include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;ll t, n, prime[
50010], tot, mo[50010], vis[50010
], ans;
void
init()
for (ll j = 1; j <= tot; j++)
mo[t] = -mo[i];}}
}ll check(ll x)
intmain()
else
l = mid + 1
; }
printf(
"%lld\n
", ans);
}return0;
}
bzoj2440 中山市選2011 完全平方數
time limit 10 sec memory limit 128 mb submit 2219 solved 1067 submit status discuss description 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有...
BZOJ2440 中山市選2011 完全平方數
求第k個非完全平方數 先二分一下,問題變成1 x有多少個非完全平方數,知道平方數的集合,可以容斥一下 為了敘述方便,下文乙個數可代表其平方的倍數的集合 被乙個集合包含的只有質數,被兩個集合包含的是質因數個數為2的數 而且所有考慮的數都不含平方因子,可以發現和 一樣,被考慮進去的數的 值就是他的係數 ...
bzoj2440 中山市選2011 完全平方數
莫比烏斯函式的應用 首先二分答案轉成判定性問題,判定乙個 1,n 有多少數不是完全平方數的倍數。乙個數是完全平方數的充要條件是它包含了某個素數的平方。那麼應用容斥,符合條件的數的個數 n n4 n 9 n25 n36.容易發現,如果乙個數是某個素數的平方,那麼它的係數一定是 1 如果是兩個素數平方的...