9.28 csp-s模拟测试54 x+y+z
T1 x
求出每个数的质因数,并查集维护因子相同的数,最后看一共有多少个联通块,$ans=2^{cnt}-2$
但是直接分解会$T$,埃筛是个很好的选择,或者利用每个数最多只会有1个大于$\sqrt{n}$的质因子,线筛$1e6$内的素数,每次只需枚举$1e3$的质因数就行,复杂度也可以过去
#include<iostream>
#include<cstdio>
#include<bitset>
#include<cmath>
#include<cstring>
#include<vector>
#define ll long long
#define mod 1000000007
using namespace std;
ll T,n,ans,a[],prime[],fa[],num,pr[],tot;
bitset<>vis;
bitset<>v;
vector<int>ve[];
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
ll quick(ll x,ll p)
{
ll as=;
while(p){
if(p&) as=as*x%mod;
x=x*x%mod;
p>>=;
}
return as;
}
ll find(ll x)
{
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
void init()
{
for(int i=;i<=;i++){
if(v[i]) continue;prime[++tot]=i;
for(int j=i;j<=;j+=i){
v[j]=;
ve[j].push_back(i);
}
}
}
int main()
{
T=read();init();
while(T--){
n=read();ans=;num=;vis.reset();memset(pr,,sizeof(pr));
for(int i=;i<=n;i++) a[i]=read(),fa[i]=i;
for(int i=;i<=n;i++){
for(int j=;j<ve[a[i]].size();j++){
if(pr[ve[a[i]][j]]) fa[find(i)]=find(pr[ve[a[i]][j]]);
else pr[ve[a[i]][j]]=i;
}
}
for(int i=;i<=n;i++){
int f=find(i);
if(!vis[f]) vis[f]=,num++;
}
ans=(quick(,num)-+mod)%mod;
printf("%lld\n",ans);
}
return ;
}
x
T2 y
$bitset$的灵活应用
一开始的思路是$2^{20}$枚举状态,记忆化搜索,$f[i][sta]$表示从i点出发能否走出$sta$的状态(状态的第一位表示长度),但是空间开不下,时间也扛不住
所以改变策略,只记录一半的状态,最后枚举中间点
$f[i][sta][j]$表示起点为$i$,终点为$j$,中间为状态$sta$是否可行
正常需要枚举一个点,一个状态,然后在枚举一个点,再枚举与第二个点有边相连的点,如果前两个点之间的$sta$状态可行,那么第一个点与第三个点之间$sta<<1|h[i].w$也是可行的
但是,时间显然不优秀
$bitset$就有用了,如果两个点之间的$sta$状态是可行的,那么第一个点与这个状态的终点和第二个点的连边是一样的,所以建边的时候用$bitset$邻接表,再加一维表示是$0$还是$1$,$bitset$合并就行,最后只需要枚举状态和中点,看是否能拼成这个状态
还有就是要在每个状态的第一位表示长度,不然$01$和$001$状态是分不清的。对于$01$串为奇数的要处理好$len/2$与$len/2+1$两个长度的关系
#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,d,ans;
bitset<>f[][(<<)+],bt[][];
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();d=read();int dd=d/,dis=d-dd;
int u,v,c;
for(int i=;i<=m;i++){
u=read();v=read();c=read();
bt[c][u][v]=;bt[c][v][u]=;
f[u][c|][v]=;f[v][c|][u]=;
}
for(int i=;i<=n;i++){
for(int sta=;sta<(<<(dis+));sta++){
for(int j=;j<=n;j++){
if(!f[i][sta][j]) continue;
f[i][sta<<|]|=bt[][j];
f[i][sta<<|]|=bt[][j];
}
}
}
for(int i=;i<(<<d);i++){
bool flag=;
for(int j=;j<=n;j++){
if(f[][i>>dd|(<<dis)][j]&&f[j][i&((<<dd)-)|(<<dd)].count()){
flag=;
break;
}
}
if(!flag&&dd!=dis){
for(int j=;j<=n;j++){
if(f[][i>>dis|(<<dd)][j]&&f[j][i&((<<dis)-)|(<<dis)].count()){
flag=;
break;
}
}
}
ans+=flag;
}
printf("%d\n",ans);
return ;
}
y
T3 z
咕了
不想退役就应该踏实
9.28 csp-s模拟测试54 x+y+z的更多相关文章
- 2019.9.28 csp-s模拟测试54 反思总结
咕咕咕的冲动如此强烈x T1x: 看完题目想了想,感觉把gcd不为1的强行放在一组,看作一个连通块,最后考虑连通块之间的组合方式就可以了. 然后维护这个连通块可以写并查集可以连边跑dfs怎么着都行… ...
- [考试反思]0928csp-s模拟测试54:转瞬
咕了好久,也没什么想说的. 下一场就又爆炸了... T3特判打丢一句话丢了14分,剩下其实都还好. T1:x 给我的第一感觉是建图找联通块,但既然只要找联通块为什么不直接并查集呢? 对于每一个数字合并 ...
- csp-s模拟测试54x,y,z题解
题面:https://www.cnblogs.com/Juve/articles/11606834.html x: 并差集,把不能分到两个集合里的元素和并到一起,设连通块个数为cnt,则答案为:$2^ ...
- Mock 模拟测试简介及 Mockito 使用入门
Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- csp-s模拟测试89
csp-s模拟测试89 $T1$想了一会儿没什么思路,一看$T2$ $1e18$当场自闭打完暴力就弃了,$T3$看完题感觉要求$lca$和$dep$,手玩了一下样例发现$lca$很显然,$dep$貌 ...
- csp-s模拟测试87
csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...
- csp-s模拟测试60
csp-s模拟测试60 2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...
随机推荐
- 掌握Spring REST TypeScript生成器
在优锐课的java分享中,讨论了关于Spring REST TypeScript生成器,该生成器创建反映后端模型和REST服务的模型和服务.码了很多干货,分享给大家参考学习. 我注意到网络开发人员创建 ...
- LeetCode 217:存在重复元素 Contains Duplicate
题目: 给定一个整数数组,判断是否存在重复元素. Given an array of integers, find if the array contains any duplicates. 如果任何 ...
- Protractor - 怎样运行
前一篇设置好了Protractor基本运行环境,那怎样运行Protractor呢? 要运行我们的测试脚本,至少需要配置好两个文件: ---Package.json ---conf.js Package ...
- PELT算法
参考:http://www.wowotech.net/process_management/PELT.html 本文是对https://lwn.net/Articles/531853/的翻译 mark ...
- 黄聪:php一句代码让http跳转https
//其他框架请加到入口某共公加载的文件中 //方法一 https状态 if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off'){ Head ...
- MySQL 中的索引
索引用来加速查询.正常来说,当查询数据时,MySQL 需要从表的第一条记录开始,读取整个表的内容,进行查询. 但如果有索引,MySQL 可根据索引快速定位需要查询条目的具体位置,加快了查询速度. 原理 ...
- C#使用Emgu CV来进行图片人脸检测
项目需求:某市级组织考试,在考试前需审核考生采集表中的考生照片是否合格,由于要审核的考生信息采集表有很多,原先进行的是手动人工审核,比较费时费力,审核的要求也很简单,并不判断考生是否是图片本人(身份验 ...
- Vue中计算属性、侦听、过滤、自定义指令、ref的操作
1.计算属性 <div id="app"> <input type="text" v-model="x"> < ...
- npm命令集合
1.npm初始化项目:npm init 或者 npm init --yes 生产 package.json文件 2.下载package.json安装包: npm install 缩写 npm i
- js获取手机唯一标识码
Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. imei: 设备的国际移动设备身份码 imsi: 设备的 ...