判斷是否存在乙個序列 $ 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 ...