题目背景

$\frac{1}{4}$遇到了一道水题,叒完全不会做,于是去请教小$D$。小$D$都没看就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了。于是,$\frac{1}{4}$只好来问你,这道题是这样的:


题目描述

给定一个长度为$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$取模。


输入格式

从文件$x.in$中读入数据。
第一行,一个非负整数$t$,代表数据组数。
每组数据的第一行,一个正整数$n$。
第二行,$n$个正整数,代表$\{a_i\}$。


输出格式

输出到文件$x.out$中。
输出$t$行,每行一个非负整数,代表答案对$10^9+7$取模的结果。


样例

样例输入:

3
3
2 3 1
3
2 3 6
4
2 3 6 1

样例输出:

6
0
2


数据范围与提示

样例解释:

$\bullet$第$1$组数据,任意一种非空集合划分均满足。
$\bullet$第$2$组数据,任意一种非空集合划分均不满足。
$\bullet$第$3$组数据,$S=\{1,2,3\},T=\{4\},gcd(a_1\times a_2\times a_3,a_4)=1$,或者$S=\{4\},T=\{1,2,3\},gcd(a_4,a_1\times a_2\times a_3)=1$。

数据范围:

保证,$0\leqslant t\leqslant 5,1\leqslant n\leqslant 10^5,1\leqslant a_i\leqslant 10^6$。


题解

似乎有一个很显然的性质:$gcd\neq 1$的连边,连通块个数为$cnt$,那么答案为$2^{cnt}−2$。

然而我考场上却没有想出来,想了一晚上才想明白,但是好多人都觉得这很显然,智商还是硬伤哇……

其他的没啥说的了,并查集维护一下联通块数就好了。

时间复杂度:$\Theta(1000000\times k)$($k$为很小的常数)。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int n;
int a[100001],fa[100001];
int que[80000],lst[80000];
bool v[1000001],vis[1000001];
long long ans;
vector<int> prime[1000001];
void pre_work()
{
ans=0;
memset(lst,0,sizeof(lst));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)fa[i]=i;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void get_prime()
{
for(int i=2;i<=1000000;i++)
{
if(v[i])continue;que[++que[0]]=i;
for(int j=i;j<=1000000;j+=i)
{
v[j]=1;
prime[j].push_back(que[0]);
}
}
}
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int main()
{
get_prime();
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
pre_work();
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
for(int j=0;j<prime[a[i]].size();j++)
if(!lst[prime[a[i]][j]])lst[prime[a[i]][j]]=i;
else fa[find(i)]=find(lst[prime[a[i]][j]]);
for(int i=1;i<=n;i++)
if(!vis[find(i)])
{
vis[find(i)]=1;
ans++;
}
printf("%lld\n",(qpow(2,ans)-2+mod)%mod);
}
return 0;
}

rp++

[CSP-S模拟测试]:x(数学+并查集)的更多相关文章

  1. [CSP-S模拟测试]:影子(并查集+LCA)

    题目描述 一个人有很多的影子,新的旧的,他们不断消失重来.学者的影子在他苍白色的精神图景里成为了$n$个黑色的点,他们伸长的触手交叉形成了一颗黑色的树.假使每个影子点拥有一个权值$d_i$,黑色的树边 ...

  2. 【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】

    第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断 ...

  3. Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))

    F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. CSP 201703-4 地铁修建【最小生成树+并查集】

    问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市 ...

  5. 蓝桥杯模拟赛 引爆炸弹-并查集+DFS

    引爆炸弹 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹, ...

  6. 并查集(Java实现)

    (最好在电脑下浏览本篇博客...手机上看代码不方便) 当时学的时候看的一本印度的数据结构书(好像是..有点忘了..反正跟同学们看的都不一样...)...里面把本文提到的所有情况都提到了,我这里只是重复 ...

  7. SP5150 JMFILTER - Junk-Mail Filte(并查集)

    直秒并查集.这题的难点就在于怎么删点.如果要删的是叶节点,那还好,直接刨掉即可 如果是中间节点甚至是根节点,那就不好办了..... solution: 对于独立一个点,我可以用邻接表模拟,然后用并查集 ...

  8. 【11.1校内测试】【快速幂DP】【带权并查集】【模拟】

    Solution $jzy$大佬用了给的原根的信息,加上矩阵快速幂150行QAQ 然而$yuli$大佬的做法不仅好懂,代码只有50行! 快速幂的思想,把m看成要组成的区间总长度,每次将两段组合得到新的 ...

  9. 【8.22校内测试】【数学】【并查集】【string】

    今天的t2t3能打出来80分的暴力都好满足啊QwQ.(%%%$idy$ 今天的签到题,做的时候一眼就看出性质叻qwq.大于11的所有数分解合数都可以用4.6.9表示,乱搞搞就可以了. #include ...

随机推荐

  1. Vagrant 手册之 Vagrantfile - SSH 设置 config.ssh

    原文地址 配置的命名空间:config.ssh config.ssh 中的设置与配置 Vagrant 如何通过 SSH 访问您的计算机相关. 大多数 Vagrant 设置一样,一般使用默认设置即可,但 ...

  2. Python笔记(十三)_os模块和os.path模块

    os模块中关于文件/目录常用的函数使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当前目录,' ...

  3. PA动画使用教程

    1.动画复制与动画粘贴.动画删除 PA的动画复制.动画粘贴不会覆盖原有动画: PPT自带的动画刷会覆盖原有动画: 注意: 超级属性的动画复制.粘贴有bug,应使用自带的动画刷: PA动画的复制.粘贴只 ...

  4. User-Based Collaborative Recommender System

    Collaborative Recommender System基于User给Item的打分表,认为相似度很高的用户,会对同一个item给出相似的分数,找出K个相似度最高的用户,集合他们的打分,来推算 ...

  5. Linux:VIM简单入手

    现在的Linux系统一般都会默认安装VIM编辑器,如果没有安装VIM编辑器,也默认一定会有VI编辑器,VI编辑器产生的时间比鼠标来的更早,虽然功能很强大,但我建议安装VIM工具,安装了VIM之后,VI ...

  6. SpringMvc.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. python——列表操作函数和方法

    1.添加新元素 1.1 append()函数 描述:append() 方法用于在列表末尾添加新的对象. 语法:list.append(obj) 参数:obj -- 添加到列表末尾的对象. 返回值:该方 ...

  8. elasticsearch 深入 —— 全文检索

    全文搜索 我们已经介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档. 全文搜索两个最重要的方面是: 相关性(Relev ...

  9. Spike Your CPU’s Processor in .Net

    using System.Threading; using System.Runtime.InteropServices; // Target a specific processor for the ...

  10. SIP UserAgent (B2BUA client)——libosip2 libeXosip2

    1. libosip2 libeXosip2 http://www.antisip.com/download/exosip2/ Features:--------eXosip2 has support ...