首页 > 其他分享 >CF1043F Make It One

CF1043F Make It One

时间:2023-11-10 16:44:21浏览次数:25  
标签:11 13 ch 17 int Make CF1043F define

题目描述

给你一个长度为 \(n\) 的序列 \(A_i\) ,问你最少能从这个集合中取出多少数使得其 \(\gcd=1\)

数据范围

\(1\leq n\leq 3\times 10^5\);\(1\leq a_i \leq 3\times 10^5\).

思路:

首先观察一下这个数据范围,其中小于 \(3\times 10^5\) 的质因数个数为 \(6\)。
所以我们可以考虑一种最大化的构造方式:

x1=2*3*5*7*11*13
x2=2*3*5*7*11 *  17
x3=2*3*5*7 *  13*17
x4=2*3*5 * 11*13*17
x5=2*3 * 7*11*13*17
x6=2 * 5*7*11*13*17
x7=  3*5*7*11*13*17

所以上界应该是 \(7\)

所以我们不妨去枚举这个上界,然后想办法进行计算。

首先令 \(cnt_i\) 表示在数列中为 \(i\) 的倍数的个数
\(f_i\) 表示 \(\gcd=i\) 的方案数
\(g_i\) 表示 \(\gcd=ki\) 的方案数

所以可以非常轻松的列出转移方程:
\(g_i=\binom{cnt_i}{k}\)
\(f_i=g_i-\sum\limits_{i|j}^{j\leq lim}f_j\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mem(a) memset(a,0,sizeof(a))
#define set(a,b) memset(a,b,sizeof(a))
#define ls p<<1
#define rs p<<1|1
#define pb push_back
#define pt putchar
#define T int t;cin>>t;while(t--)
#define begin init()
#define rand RAND
#define LOCAL
#define pii pair<int,int>
using namespace std;
char buf[1<<20],*p1,*p2;
#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
template<class Typ> Typ &re(Typ &x){char ch=gc(),sgn=0; x=0;for(;ch<'0'||ch>'9';ch=gc()) sgn|=ch=='-';for(;ch>='0'&&ch<='9';ch=gc()) x=x*10+(ch^48);return sgn&&(x=-x),x;}
template<class Typ> void wt(Typ x){if(x<0) putchar('-'),x=-x;if(x>9) wt(x/10);putchar(x%10^48);}
const int inf=0x3f3f3f3f3f;
const int maxn=3e5+5;
const int mod=1e9+7;
int seed = 19243;
unsigned rand(){return seed=(seed*48271ll)%2147483647;}
int fac[maxn],inv[maxn];
int qp(int x,int k){int res=1;while(k){if(k&1)res=res*x%mod;x=x*x%mod;k>>=1;}return res;}
void init(){int mx=maxn-5;fac[0]=1;for(int i=1;i<=mx+1;i++)fac[i]=fac[i-1]*i%mod;inv[mx+1]=qp(fac[mx+1],mod-2);for(int i=mx;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;}
int C(int n,int m){if(n<m||m<0)return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;}
void file(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);return;}
int n,m;
int a[maxn];
int mn,mx[maxn];
int f[maxn],g[maxn];
signed main(){
	begin;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],mx[a[i]]++;
	int lim=*max_element(a+1,a+n+1);
	for(int i=1;i<=300000;i++){
		for(int j=i+i;j<=300000;j+=i)
			mx[i]+=mx[j];
	}
	for(int k=1;k<=7;k++){
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g));
		for(int i=1;i<=lim;i++)g[i]=C(mx[i],k);
		for(int i=lim;i>=1;i--){
			f[i]=g[i];
			for(int j=i+i;j<=lim;j+=i)f[i]=(f[i]-f[j]+mod)%mod;
		}
		if(!mn&&f[1])mn=k;
	}
	if(!mn)puts("-1");
	else cout<<mn<<endl;
	return 0;
}

标签:11,13,ch,17,int,Make,CF1043F,define
From: https://www.cnblogs.com/Candycar/p/17824405.html

相关文章

  • make是不是go的关键字
    keywordgo语言介绍中标榜的一个重要特点是语法简单,这里有一个不同语言关键字的个数,同样是为了防止网页打不开或者丢失,这里单独复制一份:C(ANSI(C89))(32keywords)C(C11)(44keywords)C(C17)(44keywords)C(C99)(37keywords)C#(8.0)(107keywords)C++(C++03)......
  • 使用 VSCode+CMake+Ninja 开发RISC-V MCU
    1.安装软件及工具1.1VSCode安装VisualStudionCode(VSCode),是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。VSCode官网VSCode官方文档官网......
  • cmake Ninja 集成试用
    核心比较简单就是添加Ninja的依赖工具,然后再构建的时候指定生成器为Ninja使用安装ninja我使用的mac系统 brewinstallninja生成前提是已经有了一个CMakeLists.tx同时还没有初始化 cmake-GNinja..效果 构建......
  • make没有更新最新的uImage
      在LCD驱动的时候发现,linuxlogo一直弄不出来,猜想可能是因为uImage的问题,就看了一眼uImage时间:​  我现在的时间是,那可能就是没有更新make的时候没有更新,就上网搜了一下用下面的命令输出uImage:makeuImage,CALLscripts/checksyscalls.shCALLscripts/atonic/check-......
  • cmake内置变量总结
    一、概述在使用CMake配置CMakeLists.txt的时候,内置变量会极大的方便我们编写。所以在这里罗列出cmake常用的内置变量二、常用内置变量PROJECT_SOURCE_DIR项目根目录PROJECT_BINARY_DIR执行cmake命令的目录CMAKE_CURRENT_SOURCE_......
  • CMake多个CMakeLists.txt共同合作编译一个C++项目
    一、概述在C++项目比较大或者要根据不同的规则生成不同的执行文件或者动态库/静态库的时候。单独的CMakeLists.txt会变的比较复杂,此时可以利用CMakeLists.txt的父子关系分目录分模块的进行编译及输出。就相当于项目模块化编译参考博客:【大丙课堂】二、具体实现......
  • 搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板
    STM32F407-GCC-TemplateArm-none-eabi-gcc+Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板一、本次环境搭建所用的软硬件1)WindowsorLinux(本文以Windows为主)2)JLink、Daplink、Wch-Link烧录器3)GNUArmEmbeddedToolchain交叉编译器4)Mingw-w64GCCforWindows645)Debug......
  • cmake 进行rpm包构建
    cmake实际上包含了构建,测试,以及打包的能力,以下是一个简单的rpm打包测试(cpack模块)项目结构├──CMakeLists.txt├──README.md├──add.c├──add.h└──main.c代码说明main.c为一个入口(可执行文件)CMakeLists.txt是cmake的定义......
  • Makefile
    代码Version1点击查看代码hello:main.cppprinthello.cppfatorial.cppg++-ohellomain.cppprinthello.cppfactorial.cpp代码Version2点击查看代码CXX=g++TARGET=helloOBJ=main.oprinthello.ofactorial.o$(TARGET):$(OBJ)$(CXX)-o$(TARGET)......
  • Windows10+VSCode+CMake+shell脚本编译C/C++程序
    一、概述想要在Windows10上做C++验证/编译类库,借助VSCode(其实这东西要不要都行,它就是来方便查看代码的)+CMake+shell脚本做程序的编译运行。下面写一个小例子记录一下准备工作:1.编译环境用的是mingw64,使用其再带的g++编译,ps:记得要配置其环境变量2......