Problem 5 素数筛法+并查集
$des$
给定一个长度为 $n$ 的正整数序列 ${a_i }$。
将 ${1,2,...,n}$ 划分成两个非空集合 $S、T$,使得 $gcd(\prod_{i \in S} a_i,
\prod_{i \in T} a_i) = 1$
求划分方案数,对 $10^9 + 7$ 取模。
$sol$
对于两个数 $a, b$ 必须处于同一个集合,当其含有相同因子。
这样的话,将含有相同因子的数用并查集维护。
最后统计所有的 $n$ 个数被分成了 $x$ 个集合
答案就是 $2 ^ n - 2$,$1$ 需要特判
#include <bits/stdc++.h>using namespace std;#define gc getchar() inline int read() {int x = 0; char c = gc;while(c < '0' || c > '9') c = gc;while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;return x; }#define Rep(i, a, b) for(int i = a; i <= b; i ++) #define LL long longconst int N = 1e5 + 10, To = 1e6;bool Check[To + 10]; int tot, prime[To];int fa[To + 10]; int n; int A[N]; bool Use[To];void Get() {Rep(i, 2, To) {if(!Check[i]) prime[++ tot] = i;Rep(j, 1, tot) {if(prime[j] * i > To) break;Check[i * prime[j]] = 1;if(i % prime[j] == 0) break;}} }int Get(int x) {return fa[x] == x ? x : fa[x] = Get(fa[x]); }const int Mod = 1e9 + 7;LL Ksm(LL a, LL b) {LL ret = 1;while(b) {if(b & 1) ret = ret * a % Mod;a = a * a % Mod;b >>= 1;}return ret; }int vis[To];int main() {Get();for(int T = read(); T; T --) {n = read();int js = 0;memset(Use, 0, sizeof Use);int Max = 0;Rep(i, 1, n) A[i] = read(), Use[A[i]] = 1, Max = max(Max, A[i]), js += (A[i] == 1);Rep(i, 1, To) fa[i] = i;Rep(i, 1, tot) {if(prime[i] > Max) break;for(int j = 1; j * prime[i] <= Max; j ++) {int num = j * prime[i];if(Use[num]) {int fa1 = Get(num), fa2 = Get(prime[i]);if(fa1 != fa2) fa[fa1] = fa2;}}}LL up = 0;Rep(i, 1, n) {int f = Get(A[i]);if(vis[f] != T) vis[f] = T, up ++;}if(js > 1) up += (js - 1);LL ans = Ksm(2, up);ans -= 2;if(ans < 0) ans += Mod;cout << ans << "\n";}return 0; }
转载于:https://www.cnblogs.com/shandongs1/p/9770424.html
Problem 5 素数筛法+并查集相关推荐
- leetcode 952. 按公因数计算最大组件大小 (素数筛法+并查集)
题意: 给一串数,每一个数代表图的一个节点,然后两个数之间有除1之外的公因数表示这两个节点之间有边相连,求最大连通图. 做法: 如果平方找数两两之间是否存在公因数肯定超时,如果要判断两个数是否有公因数 ...
- Codeforces Contest 1081 problem D Maximum Distance —— 并查集
Chouti was tired of the tedious homework, so he opened up an old programming problem he created year ...
- CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...
- 方块游戏 (银河英雄传说)(并查集)
方块游戏 (cubes.pas/c/cpp) [题目描述] 小A和小B在玩一个方块游戏.编号为1到n(1<=n<=30000)的n个方块正放在地上.每个构成一个立方柱. 游戏开始后,小A会 ...
- D. The Door Problem 带权并查集
http://codeforces.com/contest/776/problem/D 注意到每扇门都有两个东西和它连接着,那么,如果第i扇门的状态是1,也就是已经打开了,那么连接它的两个按钮的状态应 ...
- 【bzoj 入门OJ】[NOIP 热身赛]Problem C: 星球联盟(并查集)
Problem C: 星球联盟 Time Limit: 4 Sec Memory Limit: 256 MB Submit: 57 Solved: 15 [Submit][Status][Web ...
- gym:Problem A Artwork(并查集思维题)
20162017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016 Problem A Artwork 题目链接 http://codef ...
- 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解
题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...
- P1865 A % B Problem (素数筛法,前缀和)
题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...
最新文章
- LabVIEW设计自定义滚动条
- jscience中的parse转换
- [USACO15JAN]草鉴定Grass Cownoisseur
- ASP.NET之一般处理程序笔记
- python if后面要不要加括号_Python装饰器兼容加括号与不加括号的写法
- javasript 操作option select
- 真正聪明的人从来不自己做PPT,看完这篇就放假吧!
- android-hotfix(QQ空间思路)浅析
- jsp基础代码片段(含sql与js和jsp的交互)与简易贴吧网站项目
- 2019电子科大计算机基础知识,电子科技大学820真题1999-2019终极版.pdf
- Python typing —— 类型提示(type hint)
- centos6.5 搭建时间服务器
- 两台服务器centos7.x 直接文件共享,文件挂载 nfs
- pyglet: a cross-platform windowing and multimedia
- sql:mysql:分析为什么like模糊查询效率低
- QQ空间认证之数据篇
- 学信认证使用Jetbrains教育授权方式
- 传智博客 JavaWeb方面的所有知识 听课记录 经典
- 企业的云服务选择:SaaS、PaaS、IaaS对比分析
- android流光字体实现,CSS3自定义动画实现流光文字特效
热门文章
- 使用tomcat软件在本地搭建服务器
- 科学计算机撤销,云计算环境下基于属性的撤销方案-计算机科学.PDF
- c# 指定打开某个路径下的CMD_(win10下sublime通过配置JSON调用MATLAB直接运行程序)(转载)...
- java excel读取操作,Java读取Excel并操作
- c语言的适当大小的子集,编译原理上机实验报告
- java bufferarray_如何使用Java的ByteBuffer.arrayOffset()方法
- 网络营销外包浅析网络营销外包中网站排名效果不佳的原因有哪些?
- 网络营销外包——网络营销外包专员是如何提升网站权重数值的?
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)
- oracle 日期改字符格式_oracle怎么把数值型日期转换成日期字符型