题目背景

$\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. Synchronized 详解

    为了方便记忆,将锁做如下的分类 一.对象锁 包括方法锁(默认锁对象为this,当前实例对象)和同步代码块锁(自己指定锁对象) 1.代码块形式:手动指定锁定对象,也可是是this,也可以是自定义的锁 p ...

  2. PowerShell 远程执行命令

    PowerShell 远程执行命令 最近在做一些自动化的测试工作,在代码实现的过程中需要远程启动/关闭一些服务或者测试机. 我首先想到的是建立一个website,通过网站对一些服务进行操作,但是这样感 ...

  3. Linux的mysql部署

    1.  先输入代码yum install wget -y才可以做后面的 2.下载并安装MySQL官方的 Yum Repository   代码: wget -i -c http://dev.mysql ...

  4. java_第一年_JavaWeb(9)

    JavaBean是一个遵循某种特定写法的Java类,有以下特点: 必需具有一个无参的构造函数 属性必需私有化 私有化的属性必需通过public类型的方法暴露给其它程序,其方法命名也有一定的规范 范例: ...

  5. [fw]linux 下如何查看和踢除正在登陆的其它用户

    linux 下如何查看和踢除正在登陆的其它用户 Posted on 2011/09/01   如何在linux下查看当前登录的用户,并且踢掉你认为应该踢掉的用户?请使用who这个命令来查看当前正在登录 ...

  6. 连接tomcat时,输入telnet localhost 8080后无法再次输入

    初次接触服务器时,一般会在本地建立一个微型服务器,今天在使用Apache的tomcat时,为了在命令行下访问服务器中webapps下的自定义资源:首先打开命令行窗口,然后输入telnet localh ...

  7. iBatis——自动生成DAO层接口提供操作函数(详解)

    iBatis——自动生成DAO层接口提供操作函数(详解) 在使用iBatis进行持久层管理时,发现在使用DAO层的updateByPrimaryKey.updateByPrimaryKeySelect ...

  8. mitdump爬取当当网APP图书目录

    因为mitmproxy没办法连接数据库所以,只能先把结果保存为txt文件,再读取到数据库中. 在滑动APP界面时,对代码进行分析 import requests import re import ur ...

  9. vue简单的v-for - - 路由跳转

    前几天写了一个特特特简单的小图片页面,主要用到的就是v-for遍历以及路由跳转到详情页.路由跳转需要在router文件夹下index.js引入. 导航栏(element ui导航栏为模板): < ...

  10. python车牌精确定位

    #coding=utf-8 import cv2 # 使用的是HyperLPR已经训练好了的分类器 watch_cascade = cv2.CascadeClassifier('model/casca ...