2017 多校2 hdu 6053 TrickGCD
2017 多校2 hdu 6053 TrickGCD
題目:
You are given an array \(A\) , and Zhu wants to know there are how many different array \(B\) satisfy the following conditions?
- \(1≤B_i≤A_i\)
- For each pair(\(l , r) (1≤l≤r≤n) , gcd(bl,bl+1...br)≥2\)
Input
The first line is an integer \(T(1≤T≤10)\) describe the number of test cases.
Each test case begins with an integer number n describe the size of array \(A\).
Then a line contains \(n\) numbers describe each element of \(A\)
You can assume that \(1≤n,A_i≤10^{5}\)
Output
For the \(k\)th test case , first output "Case #\(k\): " , then output an integer as answer in a single line . because the answer may be large , so you are only need to output answer mod \(10^{9}+7\)
思路:
枚舉\(g = gcd(b_1,b_2,....,b_n)\),
那么\(gcd為g\)的倍數的答案就是\(\prod_{i=1}^{n}\frac{A_i}{g}\)
每次暴力計算是不行的,想到一個數在\(g到2g-1\)除以g結果是不變的
所以可以預處理區間數字個數的前綴和,\(O(nlogn)\)類似素數篩法預處理出每個\(g\)的答案
現在要計算\(gcd為g\)的答案,我們從大到小枚舉,同時更新它的約數的答案,就可以保證不重復了
從小到大枚舉過去就要用到莫比烏斯函數去計算了
\(令F(i)為gcd為i的倍數的方案數,f(i)為gcd為i的方案數\)
\(F(i) = \sum_{i|d}^{}{f(d)} \rightarrow f(i) = \sum_{i|d}u(\fracozvdkddzhkzd{i})F(d)\)
代碼貼的是比賽時過的姿勢
轉載于:https://www.cnblogs.com/jiachinzhao/p/7267453.html
總結
以上是生活随笔為你收集整理的2017 多校2 hdu 6053 TrickGCD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阴阳师困28啥意思
- 下一篇: 为什么我们对90后的迎合难以成功?