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(\frac{d}{i})F(d)\)
代码贴的是比赛时过的姿势
转载于:https://www.cnblogs.com/jiachinzhao/p/7267453.html
总结
以上是生活随笔为你收集整理的2017 多校2 hdu 6053 TrickGCD的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 阴阳师困28啥意思
- 下一篇: 为什么我们对90后的迎合难以成功?