csp-s模拟测试54x,y,z题解
时间:2019-09-29
本文章向大家介绍csp-s模拟测试54x,y,z题解,主要包括csp-s模拟测试54x,y,z题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题面:https://www.cnblogs.com/Juve/articles/11606834.html
x:
并差集,把不能分到两个集合里的元素和并到一起,设连通块个数为cnt,则答案为:$2^cnt-2$
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #include<vector> #define re register #define int long long using namespace std; const int MAXN=1e5+5; const int mod=1e9+7; int n,a[MAXN],T,ans,num; inline int gcd(re int a,re int b){ return b==0?a:gcd(b,a%b); } inline int q_pow(re int a,re int b,re int p){ re int res=1; while(b){ if(b&1) res=res*a%p; a=a*a%p; b>>=1; } return res; } int fa[MAXN]; inline int find(re int x){ return fa[x]=(fa[x]==x?x:find(fa[x])); } vector<int>v[MAXN*10]; int prime[MAXN*10],vis[MAXN*10],tot=0,pri[MAXN*10]; void get_prime(int N){ vis[1]=1; for(int i=2;i<=N;i++){ if(!vis[i]) prime[++tot]=i,pri[i]=tot; for(int j=1;j<=tot&&i*prime[j]<=N;j++){ vis[i*prime[j]]=1; if(!(i%prime[j])) break; } } } inline void divi(re int x,re int pos){ for(re int i=1;i<=tot&&prime[i]*prime[i]<=x;++i){ if(x%prime[i]==0){ v[i].push_back(pos); while(x%prime[i]==0) x/=prime[i]; } } if(x>1) v[pri[x]].push_back(pos); } int maxx=0; signed main(){ get_prime(1e6); scanf("%lld",&T); while(T--){ scanf("%lld",&n); ans=num=maxx=0; for(re int i=1;i<=n;++i){ fa[i]=i; scanf("%lld",&a[i]); divi(a[i],i); maxx=max(maxx,a[i]); } for(int i=1;i<=tot&&prime[i]<=maxx;++i){ int N=v[i].size(); if(N==0) continue; int p=find(v[i][0]); for(int j=1;j<N;++j){ int q=find(v[i][j]); if(p!=q) fa[q]=p; } v[i].clear(); } for(int i=1;i<=n;++i){ if(fa[i]==i) ++num; } printf("%lld\n",((q_pow(2,num,mod)-2)%mod+mod)%mod); } return 0; }
y:
定义dp:f[i][j][k]表示走了i步,当前点是j,状态为k的一个bool数组,表示是否有该状态存在
为节省空间我们分两部分转移,这样第一维只有$\frac{d}{2}$,第三维只有$2^{\frac{d}{2}}$,
初始状态:$f1[0][1][0]=1,f2[0][i][0]=1(i \in n)$,
我们用连通性转移,最后统计答案是把两个dp数组的状态和在一起
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int MAXN=95; int n,m,d,len1,len2,ans=0; bool cal1[13][MAXN][(1<<13)+5],cal2[13][MAXN][(1<<13)+5]; vector< pair<int,int> >mp[MAXN]; signed main(){ scanf("%d%d%d",&n,&m,&d); len1=d/2,len2=d-len1; cal1[0][1][0]=1; for(int i=1;i<=n;++i) cal2[0][i][0]=1; for(int i=1,u,v,c;i<=m;++i){ scanf("%d%d%d",&u,&v,&c); mp[u].push_back(make_pair(v,c)); mp[v].push_back(make_pair(u,c)); } for(int i=0;i<len1;++i){ int s=(1<<i); for(int j=0;j<s;++j) for(int k=1;k<=n;++k){ int N=mp[k].size(); for(int p=0;p<N;++p) cal1[i+1][mp[k][p].first][(j<<1)+mp[k][p].second]|=cal1[i][k][j]; } } for(int i=0;i<len2;++i){ int s=(1<<i); for(int j=0;j<s;++j) for(int k=1;k<=n;++k){ int N=mp[k].size(); for(int p=0;p<N;++p) cal2[i+1][mp[k][p].first][(j<<1)+mp[k][p].second]|=cal2[i][k][j]; } } for(int i=0;i<(1<<d);++i) for(int j=1;j<=n;++j) if(cal1[len1][j][i>>len2]&&cal2[len2][j][i&((1<<len2)-1)]){ ++ans; break; } printf("%d\n",ans); return 0; }
z:
全机房没几个作出来的,只能放标算了,去题面里找
原文地址:https://www.cnblogs.com/Juve/p/11606844.html
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- 【Spring实战】—— 7 复杂集合类型的注入
- 【Spring实战】—— 6 内部Bean
- 几款可替代Dreamweaver的HTML5开发工具
- Linux下的Telnet设置方法介绍
- 2017年11月互联网和相关服务业保持快速增长
- 深度学习胸部x射线
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020年8月26日更新WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。
- python 自动化测试(3):数据库连接与使用
- 微信小程序实战开发二:微信小程序 WEUL组件之 画廊组件
- 关于Cookie和Session
- 微信小程序实战开发一:在小程序中使用useExtendedLib方法引入官方UI
- python 自动化测试(4):日志类封装
- 微信小程序实战开发三:小程序之全局配置APP.JSON之底部菜单栏tabBar
- python 自动化测试(5):页面基类封装
- 微信小程序实战开发四:小程序获取用户信息流程及信息存储方式解析
- python 自动化测试(6):jar包调用
- 微信小程序实战开发五:使用自定义组件配置一个通用的图片轮播组件。
- 亿级流量系统如何玩转 JVM
- 微信小程序实战开发六:使用weui-flex创建一个可自由配置的布局组件。
- JDBCJava连接MySql数据库
- Python中的集合