yzoj 2372 小B的數字 題解

2022-05-06 21:24:08 字數 1801 閱讀 4097

判斷是否存在乙個序列 $ b_i $ 使得 $ \prod_^ b_i \ | b_i^$ 恆成立,其中 $ b_i $ 中的每個數都是2的正整數次冪。

3

23 2

33 3 3

21 10

yes

yesno

對於 100% 的資料有 $ n \leq 10^5,a_i \leq 10,t \leq 10$

首先拿到這道題,考場一看就知道不是規律題就是數學公式題,事實上是的。

我們可以設 $ b_i=2^ $ 其中 $ x_i \(為正整數,\) lcm(a_1,a_2,a_3....a_n)=lcm $ , $ sum=\sum_^ x_i\ $。

那麼我們可以將原式子化為 $ 2^ | 2^ $,顯然要使此式恆成立,就要滿足 $ a_i * x_i \geq sum $.

此式子可以轉化為 $ lcm* x_i \geq sum* \frac $

左右兩邊相加可得

$ lcm* sum \geq sum * ( \sum_^ }\ )$

即 $ lcm \geq ( \sum_^ }\ )$

兩邊提出 $ lcm $約去得到 $ 1 \geq ( \sum_^ }\ )$

那麼我們可以得出最終公式就是 $ ( \sum_^ }\ \leq 1) $

如果我們直接同分比較,很顯然會超資料範圍。

對於這一題,由於涉及倒數,會產生浮點誤差,我們有三種方法去處理

方法一(不推薦

在最終判斷的時候設定精度進行調控

#includeusing namespace std;

const double eps=1e-6;

int t,n,k;

bool cheak(double a,double b)

int main()

if(cheak(sum,(double)1)) printf("yes\n");

else printf("no\n");

} return 0;

}

方法二(正解

我們可以觀察資料,可以知道 $ a_i \leq 10 $ 我們最終得到得式子也只與 $ a_i $ 得倒數有關,所以我們可以將式子改造,左右兩邊乘以 $ 10! $,也就是

$ ( \sum_^ }\ \leq 10!) $

於是運算便變為了整數運算,便不存在浮點誤差了!(常用技巧)

#include #include #include using namespace std; 

typedef long long ll;

int main()^ }\ \leq 1) $ 我們可以發現如果 $ n > max(a_i) $ 那麼這個式子必然不成立,所以我們可以把n的範圍縮小到 $ max(a_i) $ 以內,那麼我們通分就不會超出範圍了於是便有了乙個愉快的暴力

#includeusing namespace std;

int main()

if(!flag || n>maxn) printf("no\n");

else puts(tot<=pop ? "yes" : "no");

} return 0;

}

HRBUST 2372 小L的問題

problem input輸入資料第一行為t,代表資料組數。接下來的t行中,每一行只有乙個數字n,n為不超過1e18的正整數,代表棋盤的長度。output輸出t行,每行為對應n的答案。sample input1 2sample output2code include define ll long l...

2483 小b和回文數(列舉)

小b覺得回文數很美。對於乙個正整數x,如果從左到右讀和從右到左讀是一樣的,則稱x為回文數。例如 123 從右到左讀是 321 所以它不是回文數 而 121 則是回文數。現在給定整數n,求距離n最近的回文數。即找到乙個回文數x 本題x不能等於n 使得 x n 最小。如果有多個滿足條件的x,輸出最小的那...

小B的詢問

這裡不講莫隊的思路,各路大神已經講清楚了。我們講一下如何卡常。把正常的莫隊交上去,記錄。單個點 1784ms 把每一次詢問的右邊界 right i 從小到大改為從打到小,快了了一點。注意要把陣列開小點。1522ms 如果分為 trunc sqrt n 塊不好,然後分別試著分為 n 6 和 n 10 ...