题目背景

$\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. poj3280Cheapest Palindrome

    给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符Add与Delete的代价,求将S变为回文串的最小代价和. Input 第一行 ...

  2. Apache Shiro简单介绍

    1. 概念 Apache Shiro 是一个开源安全框架,提供身份验证.授权.密码学和会话管理.Shiro 框架具有直观.易用等特性,同时也能提供健壮的安全性,虽然它的功能不如 SpringSecur ...

  3. Java IO(1)

    IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好. 关于File类 Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处 ...

  4. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  5. Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法

    上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事前端工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知 ...

  6. spring-第七篇之深入理解容器中的bean

    1.抽象bean与子bean 用于指定配置模板. 2.容器中的工厂bean 这种工厂bean必须实现FactoryBean接口,通过spring容器getBean()方法获取它时,容器返回的不是Fac ...

  7. Struts2之上传

    单文件上传 上传页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  8. JSTL 使用 c:forEach 累加变量值

    <body> <%    int x = 1;    int y = 2;    request.setAttribute("x", x);    request ...

  9. EAN13条码的校验位的Excel算法

    校验位原公式: 单元格=10-RIGHT(SUM(MID($B3,{1;2;3;4;5;6;7;8;9;10;11;12},1)*{1;3;1;3;1;3;1;3;1;3;1;3})) 简化公式: 单 ...

  10. How To Find Out Attachments By File Type In Outlook?

    ext: (extension extension) Take the attachments of zip files and of txt files for example, just ente ...