jzoj5843
给定 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為2i,3i…的方案,所以我們在後面將它們減去了。而在這個方程之中,我們可以倒序枚舉i,這樣我們可以保證計算出f[i]前,f[2i],f[3*i]…已經計算出來了
最後,由於題目要求,我們要記錄gcd的和,所以我們要求f[1]*1,f[2]*2…的值
這樣,我們就成功解決了本題
jzoj5843的更多相关文章
随机推荐
- 64bits access
http://www.codicode.com/art/64_bit_version_of_microsoft_jet.aspx
- 为什么大神的UI设计那么高级?答案尽在此文…
对于每个网页设计师而言,在设计过程中总会碰到需要作出设计决策的时候.也许你的公司并没有全职设计师,而需求上则要求设计出全新的UI:又或者你正在制作一个你自己的个人项目,而你希望它比 Bootstrap ...
- CSV 文件
CSV 文件 CSV(Comma Separated Values 逗号分隔值) 是一种文件格式(如.txt..doc等),也可理解 .csv 文件就是一种特殊格式的纯文本文件.即是一组字符序列,字符 ...
- Zookeeper 系列(二)安装配制
Zookeeper 系列(二)安装配制 一.Zookeeper 的搭建方式 Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式. 单机模式 :Zookeeper 只运行在一台服务器上 ...
- 5条面经,助你成功拿到UX设计师Offer
为什么成为 UX设计师? 如果你经常逛推酷, 知乎, 设计达人或者一些专业的设计师论坛,博客,你会发现,第一批成为UX设计师的人,其实是误打误撞地落入这个行业的.那时候人们并不清楚UX设计师是什么 ...
- stl学习记录(1)
Effective STL 中文版学习记录 条款4 判断容器是否为空 使用empty而不是size().size()操作在实现上不是一个时间常数操作条款5 尽量使用区间成员函数代替它们的单元素兄弟.S ...
- 在centos7.1上安装systemd
1.检查本地systemd的版本 [admin@localhost ~]$ systemctl --version systemd 208 +PAM +LIBWRAP +AUDI ...
- java redis基本操作
package com.redis; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import ...
- public static void main(String[] args)说明
/*public static void main(String[] args) 主函数特殊之处:1,格式是固定的.2,被jvm所识别和调用. public:因为权限必须是最大的.static:不需要 ...
- 深度linux没有ll等命令的解决办法
编辑~/.bashrc, 添加alias 如下 vim ~/.bashrc 设置别名. 添加如下行 alias ll='ls -alF' alias la='ls -A' alias vi='vim' ...