CF1043F Make It One

题意

从一堆数中选择最少的数,使它们的\(\gcd=1\)

输入输出格式

输入格式

第一行:一个正整数\(n\)。

第二行:\(n\)个正整数,给出了这个数列。

输出格式

一行,\(-1\)(如果任意选择都不能得到\(1\)分)或一个正整数(表示选择的数的数量的最小值)

数据范围

\(1\leq n\leq 300,000 , 1\leq a_i \leq 300,000\).


第二次遇到此类题了,反演理解的不好,不清楚怎么用反演理解这个题。

不过容斥的方法还挺神的(虽然可能感觉有点套路?

发现选择的数不会超过\(7\)个,因为\(2 \times 3 \times 5 \times 7 \times 11 \times 13 \times 17 >3\times 10^5\)

直接暴力枚举选几个数

然后设\(dp_{i,j}\)表示选\(i\)了\(i\)个数且这\(i\)个数\(\gcd=j\)的方案数

\(dp_{i,j}=\binom{cnt_j}{i}-\sum_{j|k}f_{i,k}\)

\(cnt_j\)表示有多少个数是\(j\)的倍数


Code:

#include <cstdio>
#include <cstring>
#define ll long long
const int N=3e5+10;
const ll mod=1e9+7;
ll qp(ll d,ll k)
{
ll f=1;
while(k)
{
if(k&1) f=f*d%mod;
d=d*d%mod;
k>>=1;
}
return f;
}
ll fac[N],inv[N],dp[N];
int n,cnt[N],mx;
int main()
{
scanf("%d",&n);
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
inv[n]=qp(fac[n],mod-2);
for(int i=n-1;~i;i--) inv[i]=inv[i+1]*(i+1)%mod;
for(int a,i=1;i<=n;i++) scanf("%d",&a),++cnt[a],mx=mx>a?mx:a;
for(int i=1;i<=mx;i++)
for(int j=i<<1;j<=mx;j+=i)
cnt[i]+=cnt[j];
for(int i=1;i<=7;i++)
{
memset(dp,0,sizeof(dp));
for(int j=mx;j;j--)
{
dp[j]=cnt[j]>=i?fac[cnt[j]]*inv[cnt[j]-i]%mod*inv[i]%mod:0;
if(dp[j])
for(int k=j<<1;k<=mx;k+=j)
(dp[j]-=dp[k])%=mod;
(dp[j]+=mod)%=mod;
}
if(dp[1]) return printf("%d\n",i),0;
}
puts("-1");
return 0;
}

2018.11.5

洛谷 CF1043F Make It One 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  7. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  8. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  9. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

随机推荐

  1. Selenium(Python)调用pywin32上传图片

    import unittestfrom time import sleep import osfrom selenium import webdriverimport win32apiimport w ...

  2. 第三十九篇 Python异常处理

    一. 什么是异常 异常就是程序运行时发生的错误,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误触发的异常如下 错误分成两种: #语法 ...

  3. 使用advanced_installer将.net web程序打包为安装程序

    当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...

  4. leetcode-数数并说

     数数并说     报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  " ...

  5. Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList

    本博文归纳在 Vue 学习过程中, Vue-cli 工具的使用说明.除此之外还通过 Vue-cli 工具将之前 Vuejs 基本语法当中实现的 todoList 进行重构. 安装 npm instal ...

  6. visionpro吧-百度贴吧

    Halcon,Visionpro视频教程,观看下载地址:http://www.211code.com

  7. Merkle Patricia Tree (MPT) 以太坊中的默克尔树

    本篇博文是自己学习mpt的过程,边学边记录,很多原理性内容非自己原创,好的博文将会以链接形式进行共享. 一.什么是mpt MPT是以太坊中的merkle改进树,基于基数树,即前缀树改进而来,大大提高了 ...

  8. 十三:Transparent Encryption in HDFS(转)

    透明加密:http://blog.csdn.net/linlinv3/article/details/44963429 hadoop透明加密  kms 简介      Hadoop Key Manag ...

  9. C Program进阶-二维数组动态内存开辟

    对于二维数组,我们知道可以用Type ArrayName[Row][Colume]的方式来定义,这是一种静态内存开辟的方式,程序在编译的时候就为该数组分配了空间,而且行和列大小也是指定的.这篇文章里我 ...

  10. http://www.cnblogs.com/120626fj/p/7545958.html

    1.本周PSP 2.本周进度条: 代码行,博文字数,用到的知识点 3.累计进度图 3.1累计代码折线图 3.2累计博文字数折线图 4.本周PSP饼状图