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的更多相关文章
随机推荐
- spring mvc 默认页面
只需要在servlet.xml页面中添加如下配置: <mvc:view-controller path="/" view-name="login"/> ...
- 内网IP和公网IP的区别
内网IP和公网IP的区别 什么是内网IP: 一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网.而 ...
- 2018.09.29 bzoj3156: 防御准备(斜率优化dp)
传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...
- 2018.09.12 poj3621Sightseeing Cows(01分数规划+spfa判环)
传送门 01分数规划板题啊. 发现就是一个最优比率环. 这个直接二分+spfa判负环就行了. 代码: #include<iostream> #include<cstdio> # ...
- hdu-1166(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 思路:线段树模板 #include<iostream> #include<cs ...
- Django入门与实践-第21章:迁移(完结)
http://127.0.0.1:8000/boards/1/ python manage.py migrate #boards/models.py class Topic(models.Model) ...
- UVa 11039 Building designing (贪心+排序+模拟)
题意:给定n个非0绝对值不相同的数,让他们排成一列,符号交替但绝对值递增,求最长的序列长度. 析:我个去简单啊,也就是个水题.首先先把他们的绝对值按递增的顺序排序,然后呢,挨着扫一遍,只有符号不同才计 ...
- 关于this对象
1.在全局函数中this指的是window 2.当函数被当做方法调用时,this等于那个对象 3.匿名函数具有全局性,只要是匿名函数,this指向window 实例1: var name = 'the ...
- Python+Android开发
1 下载Scripting Layer for Android (SL4A) Scripting Layer for Android (SL4A) 是一个开源项目,目标是为android系统提供脚本语 ...
- hdu1081 To The Max 2016-09-11 10:06 29人阅读 评论(0) 收藏
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...