题面: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:

全机房没几个作出来的,只能放标算了,去题面里找

csp-s模拟测试54x,y,z题解的更多相关文章

  1. [CSP-S模拟测试]:小Y的图(最小生成树+LCA)

    题目传送门(内部题131) 输入格式 第一行三个整数$n$.$m$和$Q$. 接下来$m$行每行三个整数$x$.$y$.$z$($1\leqslant x,y\leqslant n,1\leqslan ...

  2. [CSP模拟测试43、44]题解

    状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...

  3. [20190727NOIP模拟测试9]单(single) 题解(树上dp)

    啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...

  4. [NOIP模拟测试9]题(Problem) 题解 (组合数全家桶+dp)

    达哥送分给我我都不要,感觉自己挺牛批. $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=\sum C_n^i \times C_i^{\frac{i}{2}} \t ...

  5. [7.18NOIP模拟测试5]砍树 题解(数论分块)

    题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...

  6. [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)

    Orz 出题人石二队爷 我们可以先求出有n个点的联通欧拉图数量,然后使它删或增一条边得到我们要求的方案 也就是让它乘上$C_n^2$ (n个点里选2个点,要么删边要么连边,选择唯一) 那么接下来就是求 ...

  7. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  8. [CSP-S模拟测试92]题解

    A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...

  9. [CSP-S模拟测试86]题解

    好久没有写整套题的题解了呢……主要是这两天考试题愈发神仙 实在是超出了垃圾博主的能力范围啊QAQ A.异或 不难想到,如果我们得到了$[L,R]$中每一位上0和1的个数,那么答案即为$2 \times ...

随机推荐

  1. git相关操作。

    之前只会用图形端的GIT中,命令行的比较陌生,整理下,供自己以后参考 关键的名词: 工作区:工作区 Index / Stage:暂存区 仓库:仓库区(或本地仓库) 远程控制:远程仓库 到项目目录下gi ...

  2. Apache Shiro RememberMe 1.2.4 反序列化漏洞

    拉取镜像 docker pull medicean/vulapps:s_shiro_1 启动环境 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 ...

  3. Netty环境安装配置

    本章中介绍的Netty开发环境的安装及配置; 这个一系列教程示例的Netty最低要求只有两个:最新版本的Netty 4.x和JDK 1.6及更高版本. 最新版本的Netty在项目下载页面中可找到:ht ...

  4. JavaScript网页特效5则

    动态字幕 代码:在需要处加入 < marquee onmouseover=this.stop() onmouseout=this.start()>欢迎访问JavaScript教程网 特点: ...

  5. webAPI(DOM) 2.1 获取页面元素 | 事件1 | 属性操作 | 节点 | 创建元素 | 事件2

    js分三个部分: ECMAScript标准:js的基本语法 DOM:Ducument Object Model--->文档对象模型--->操作页面的元素 BOM:Browser Objec ...

  6. jdbc出现中文乱码的解决办法

  7. Spring Cloud高级视频

    Spring Cloud高级视频 第一章 微服务架构概述 第二章 开始使用Spring Cloud实战微服务 第三章 服务提供者与服务消费者 第四章 服务发现与服务注册 第五章 使用Hystrix保护 ...

  8. sql 保存,性能高

    INSERT INTO TABLE( Id, Name) VALUES ( 4, 'A'), ( 5, 'P' ),( 6, 'U') ; INSERT INTO TABLE( Id, Name) S ...

  9. 前端常用的库和实用技术之JavaScript面向切面编程

    Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...

  10. js实现F5键刷新后菜单保持之前状态以及监听F5页面刷新子iframe 而父页面不刷新

    利用layui实现菜单效果时,刷新页面仍回到首页状态,需要 实现iframe子页面刷新父元素不刷新,下面是代码 //刷新时禁用F5的默认事件 $(document).keydown(function ...