考试的时候考的一道题,感觉挺神的.
我们发现将所有数去重后最多只会选不到 $7$ 后 $gcd$ 就会变成 $1$.
令 $f[i][k]$ 表示选 $i$ 个数后 $gcd$ 为 $k$ 的方案数.
那么这 $i$ 个数中每个数都必须是 $k$ 的倍数.
令 $cnt[k]$ 为所有数中是 $k$ 的倍数的个数,这个可以在接近线性的时间内求出.
那么,选 $i$ 个数的总方案数位 $C_{cnt[k]}^{i}$,不和法的方案为这 $i$ 个数的 $gcd$ 是大于 $k$ 的,即 $k$ 的倍数.
所以,综上,$f[i][k]=C_{cnt[k]}^{i}-\sum f[i][k\times d]$ ( $d$ 随便枚举一下就行).

#include <cstdio>
#include <algorithm>
#define ll long long
#define N 300002
#define mod 998244353
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll fac[N],inv[N];
int arr[N],cnt[N],f[12][300001];
ll qpow(ll base,ll k)
{
ll tmp=1;
for(;k;base=base*base%mod,k>>=1) tmp=tmp*base%mod;
return tmp;
}
ll C(int n,int m)
{
if(n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
int i,j,n,M=0;
// setIO("input");
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&arr[i]), cnt[arr[i]]++, f[1][arr[i]]++;
M=max(M,arr[i]);
if(arr[i]==1)
{
printf("1\n");
return 0;
}
}
fac[0]=1;
for(i=1;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod;
inv[N-1]=qpow(fac[N-1],mod-2);
for(i=N-1;i>=1;--i) inv[i-1]=i*inv[i]%mod;
for(i=1;i<=M;++i)
for(j=i+i;j<=M;j+=i) cnt[i]+=cnt[j];
for(i=2;i<=11;++i)
{
for(j=M;j>=1;--j)
{
f[i][j]=C(cnt[j], i);
for(int k=j+j;k<=M;k+=j) f[i][j]=(f[i][j]-f[i][k]+mod)%mod;
}
if(f[i][1]>0)
{
printf("%d\n",i);
return 0;
}
}
printf("-1\n");
return 0;
}

  

CF1043F Make It One 容斥+dp+组合的更多相关文章

  1. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  2. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  3. hdu6143 Killer Names 容斥+排列组合

    /** 题目:hdu6143 Killer Names 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:有m种字符(可以不用完),组成两个长度 ...

  4. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  5. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  6. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  7. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  8. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  9. BZOJ.4767.两双手(组合 容斥 DP)

    题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ...

随机推荐

  1. windows vue环境搭建

    windows环境搭建Vue开发环境 一.安装node.js(https://nodejs.org/en/) 下载完毕后,可以安装node,建议不要安装在系统盘(如C:). 二.设置nodejs pr ...

  2. Map以及HashMap

    本文主要介绍java集合框架的Map集合,在日常生活中Map的运用也十分广泛. 与List集合.Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口. ...

  3. 在.Net中使用RedLock实现分布式锁

    ⒈简介 RedLock 分布式锁算法由 Redis 的作者提出,大部分语言都有对应的实现,查看,RedLock.net 是 RedLock 分布式锁算法的 .NET 版实现,用来解决分布式下的并发问题 ...

  4. Go语言中的切片(十)

    go中数组的长度是固定的,且不同长度的数组是不同类型,这样的限制带来不少局限性.于是切片就来了,切片(Slice)是一个拥有相同类型元素的可变长度的序列.它是基于数组类型做的一层封装.它非常灵活,支持 ...

  5. Django基础之jQuery操作

    Django基础之jQuery操作 jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.j ...

  6. tensorflow 使用tfrecords创建自己数据集

    直接采用矩阵方式建立数据集见:https://www.cnblogs.com/WSX1994/p/10128338.html 制作自己的数据集(使用tfrecords) 为什么采用这个格式? TFRe ...

  7. Docker国内Yum源和国内镜像仓库

    Docker国内Yum源和国内镜像仓库 2018年05月29日 :: nklinsirui 阅读数 6295更多 分类专栏: Docker 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa ...

  8. Linux小知识:sudo su和su的区别

    Linux小知识:sudo su和su的区别 本文是学习笔记,视频地址:https://www.bilibili.com/video/av62836363 su是申请切换root用户,需要申请root ...

  9. kill指定用户所有进程

    在linux系统管理中,我们有时候需要kill某个用户的所有进程,这里有以下几种方法,以heboan用为例 pkill方式 pkill -u heboan killall方式 killall -u h ...

  10. 文件hash、上传,实现文件上传重复验证

    在平台开发中,我们往往对性能要求十分严苛,每一个字段.接口都有严格的要求. 系统中文件流操作十分占用资源,这里为大家介绍对文件上传进行哈希校验---同一文件只允许上传一次到服务器,其他的上传只要指向文 ...