Codeforces.1043F.Make It One(DP 容斥)
\(Description\)
给定\(n\)个数\(A_i\),求最少选出多少个数,使得它们的\(\gcd\)为\(1\)。
\(n,A_i\leq3\times10^5\)。
\(Solution\)
首先如果有解,答案不会超过\(7\)(\(7\)个质数的乘积就会大于\(300000\))(但是\(6\)个不会!所以答案可能是\(7\)的啊=-=zz如我)。
所以令\(f[i][j]\)表示选了\(i\)个数,使得它们\(\gcd=j\)的方案数。因为DP不好算考虑直接计数。
记\(cnt_i\)表示含有因子\(i\)的数的个数。
那么$$f[i][j]=C_{cnt_j}^i-\sum_{j\mid k,k\neq j}f[i][k]$$
判一下是否有\(f[i][1]>0\)即可。
复杂度\(O(7n\log n)\)。
//78ms 4500KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mod 1000000009
#define C(n,m) (n<m?0:1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod)
#define gc() getchar()
typedef long long LL;
const int N=3e5+5;
int f[N],cnt[N],fac[N],ifac[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod) k&1&&(t=1ll*t*x%mod);
return t;
}
int main()
{
int n=read(),mx=0;
for(int i=1,a; i<=n; ++i) mx=std::max(mx,a=read()), ++cnt[a];
if(cnt[1]) return puts("1"),0;
fac[0]=fac[1]=1;
for(int i=2; i<=n; ++i) fac[i]=1ll*i*fac[i-1]%mod;
ifac[n]=FP(fac[n],mod-2);
for(int i=n; i; --i) ifac[i-1]=1ll*i*ifac[i]%mod;
cnt[1]=n;
for(int i=2; i<=mx; ++i)
for(int j=i<<1; j<=mx; j+=i) cnt[i]+=cnt[j];
for(int i=2; i<=7; ++i)
{
for(int j=mx; j; --j)
{
LL tmp=C(cnt[j],i);
for(int k=j<<1; k<=mx; k+=j) tmp-=f[k];
f[j]=(tmp%mod+mod)%mod;
}
if(f[1]) return printf("%d\n",i),0;
}
puts("-1");
return 0;
}
Codeforces.1043F.Make It One(DP 容斥)的更多相关文章
- bzoj 3622 DP + 容斥
LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- Codeforces 611C New Year and Domino DP+容斥
"#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- Codeforces 1553I - Stairs(分治 NTT+容斥)
Codeforces 题面传送门 & 洛谷题面传送门 u1s1 感觉这道题放到 D1+D2 里作为 5250 分的 I 有点偏简单了吧 首先一件非常显然的事情是,如果我们已知了排列对应的阶梯序 ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...
- CF285E Positions in Permutations(dp+容斥)
题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...
随机推荐
- FileSaver.js 文件下载
安装: npm install file-saver --save 或者(需下载FileSaver.js文件) <script src="path/FileSaver.js" ...
- LOJ#2723 多边形
解:首先,n<=20的直接暴力建图然后状压哈密顿回路,相信大家都会.固定1为起点,fi,s表示结尾为i点,状态为s.每次遍历i的出边转移,最后遍历1的出边统计答案.n22n. 然后就是正经题解了 ...
- Pandas系列(九)-分组聚合详解
目录 1. 将对象分割成组 1.1 关闭排序 1.2 选择列 1.3 遍历分组 1.4 选择一个组 2. 聚合 2.1 一次应用多个聚合操作 2.2 对DataFrame列应用不同的聚合操作 3. t ...
- Centos7的目录结构
CentOS 目录结构 : /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制 ...
- windows linux 文件编码转换
查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编码:set fileencoding即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决用Vi ...
- 分布式监控系统开发【day38】:报警策略设计(二)
一.策略和动作多对多的好处坏处 1.好处: 相同服务,相同策略的服务可以不用重复写好多次触发器 2.坏处: 1.策略A给小李和小罗发邮件2.策略B给小胡和小崔发邮件3.策略A是第三部发邮件4.策略B是 ...
- CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑
1.服务器端目录结构: 1.__init__.py from django.conf import settings from repository import models import impo ...
- tomcat 线程池
web server允许的最大线程连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右. 1.编辑tomcat安装目录下的conf目录下的server. ...
- WPS for Linux 2017版+字库安装
一.下载地址: http://wps-community.org/download.html WPS Office for Linux Alpha21[2017-06-15] http://wps-c ...
- 预置app/apk到系统 && 预置so库进系统 && 预置普通文件和文件夹进系统
https://blog.csdn.net/zhandoushi1982/article/details/4695460