给定 n 个正整数序列 ,每个序列长度为m。

选择至少 1 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 gcd。

求所有方案的结果之和,答案对 1e9+7 取模。两种方案不同,当且仅当存在至少一个元素,在一种方案中被选择,在另一种中没有。

這道題看n=20 m=1e5的範圍就知道不可能進行枚舉算法

枚舉是O(m^n)的,一定會tle,得想更加快速的方法

在計數問題中,我們經常會想到容斥原理

而且這道題的數範圍也只有1e5,我們應該想到按照每一個數的值來計算答案

在這道題之中,計算出“每一行能夠不選或只選1個數,但是必須至少選1個數,要求這些選出來的數被k整除”很容易。只要計cnt[i][j]表示第i行有多少個數是j的倍數。

如何求cnt數組,我們可以記錄cnt[i][j],將cnt[i][a[i][j]]全部+1,代表現在,我們已經存儲了a[i][j]被自己整除的方案了

現在我們知道,當一個數是ak的倍數時,這個數同時也是a的倍數,所以我們可以知道,f[i][kj]可以用來更新f[i][j]。

則ans=(cnt[1][k]+1)(cnt[2][k]+1)…(cnt[n][k]+1)-1

在這道題中,一行有cnt[i][k]個數可以選擇,而且這一行可以一個數都不選,有cnt[i][k]+1種方案,全部乘起來就是答案

但是,我們還有可能一個數都沒有選,這種情況計算了進去,所以最後的方案要-1

在這道題中,我們也可以想到類似的思路

記ans[k]表示全局選出的數能夠被k整除的方案數

則ans[k]=(cnt[1][k]+1)
(cnt[2][k]+1)…(cnt[n][k]+1)-1

用這個公式可以快速計算出所有的ans

但是,這道題要求求的是gcd==k的個數,這個公式不能滿足要求

因為我們選出的方案中,只代表gcd能夠被k整除,而不可以代表“gcd恰好為k的方案數"

實際上,我們還計算出了gcd為2k,gcd為3k等等的方案數,所以我們需要將其減去

設f[i]表示gcd恰好為i的方案數

則f[i]=ans[i]-f[2i]-f[3i]…-f[(n/i)i]

式子的前一項為"gcd被i整除"的方案數,但是我們不需要gcd為2
i,3i…的方案,所以我們在後面將它們減去了。而在這個方程之中,我們可以倒序枚舉i,這樣我們可以保證計算出f[i]前,f[2i],f[3*i]…已經計算出來了

最後,由於題目要求,我們要記錄gcd的和,所以我們要求f[1]*1,f[2]*2…的值

這樣,我們就成功解決了本題

jzoj5843的更多相关文章

随机推荐

  1. .zip/.rar打包与解压

    Linux下如何解压.zip和.rar文件,对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们: 1)对于zip linux下提供了zip和unzip程序,zip是 ...

  2. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)

       有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...

  3. Underscore模版引擎的使用-template方法

    之前项目里有遇到在DOM中增加大量的html结构的时候,傻乎乎的在js中写一堆模版,然后用replace一个一个做替换.当时就是难看了点,不觉得啥,现在了解了模版引擎之后回头来看真的比较捉急了,以后是 ...

  4. POJ3687.Labeling Balls 拓扑排序

    Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...

  5. 结构体的sort【防止遗忘w】

    #include<iostream> #include<algorithm> using namespace std; int n; struct jie { int num; ...

  6. Jmeter参数化HTTP request中Send Files With The Request的文件路径和文件名

  7. c++日志练习

    使用ostream流创建写入log日志文件 使用宏 配置文件大小和间隔时间  当创建文件时间间隔或文件大小大于指定数字 则创建新文件 文件名由时间自动命名 /********************* ...

  8. Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子

    转自:http://www.blogjava.net/wangxinsh55/archive/2011/07/24/354925.html   Jbpm4.4+hibernate3.5.4+sprin ...

  9. 2018.07.22 洛谷P2986 伟大的奶牛聚集(树形dp)

    传送门 给出一棵树,树有边权和点权,若选定一个点作为中心,这棵树的代价是所有点权乘上到根的距离的和.求代价最小. 解法:一道明显的换根dp" role="presentation& ...

  10. hdu-1061(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1061 思路:快速幂 #include<iostream> #include<cstd ...