模拟测试57

T1:

  贴心送分题。

  对于每种颜色,如果多了,就会有多的数量除二的贡献,反之会有少的数量的需求。

  最后判断贡献和需求哪个大即可。

  时间复杂度$O(1)$。

T2:

  边数太多,考虑将状态记录在点上。

  每一种可行方案是一个dag,可以按照拓扑序列分层。

  状态记录当前选中的集合,和最后一层的点的集合,然后枚举状态更新即可。

  更新时算出当前集合向拓展集合连的边数,每个点至少要有一条入边。

  考虑优化,省去第二维状态。

  枚举补集的子集,算出当前集合向拓展集合连的边数,每条边都可以连或不连。

  但是这样会算重,因为每次算出的方案并不一定能连接拓展集合的所有点。

  根据点数容斥一下,奇加偶减即可。

  注意枚举子集的内部不能再用循环算边数,从小到大枚举子集,做一个小的递推即可。

  时间复杂度$O(3^n+m2^n)$

T3:

  莫比乌斯反演神题。

  $lcm$大于$n$的数对数不好求,考虑求$lcm$小于$n$的数对数。

  设这样求出的数对数为$res$,那么答案可以表示为:

    $ans=n^2-res$

  考虑求$res$:

    $\large \begin{array}{ll} res &=& \sum \limits_{i=1}^n \sum \limits_{j=1}^n [lcm(i,j)<=n] \\ &=& \sum \limits_{d=1}^n \sum \limits_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum \limits_{j=1}^{\lfloor \frac{n}{id} \rfloor} [gcd(i,j)==1]*[ijd<=n] \\ &=& \sum \limits_{d=1}^n \sum \limits_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum \limits_{j=1}^{\lfloor \frac{n}{id} \rfloor} \sum \limits_{g|gcd(i,j)} \mu(g) *[ijd<=n] \\ &=& \sum \limits_{d=1}^n \sum \limits_{g=1}^{\lfloor \sqrt{ \frac{n}{d}} \rfloor} \mu(g) \sum \limits_{i=1}^{\lfloor \frac{n}{dg^2} \rfloor} \sum \limits_{j=1}^{\lfloor \frac{n}{idg^2} \rfloor} [ijdg^2<=n] \\ &=& \sum \limits_{g=1}^{\sqrt{n}} \mu(g) \sum \limits_{d=1}^{\lfloor \frac{n}{g^2} \rfloor} \sum \limits_{i=1}^{\lfloor \frac{n}{dg^2} \rfloor} \sum \limits_{j=1}^{\lfloor \frac{n}{idg^2} \rfloor} [ijdg^2<=n]\end{array}$

  发现$d$,$i$,$j$并没有本质区别,于是我们可以假定$d<=i<=j$,然后再乘上排列数。

  于是上界可以卡的更小。

  $d$,$i$,$j$中两个数相等,排列数为3;三个数都相等,排列数为1;三个数都不等,排列数为6。

    $\large \begin{array}{ll} res &=& \sum \limits_{g=1}^{\sqrt{n}} \mu(g) \sum \limits_{d=1}^{\lfloor \sqrt[3]{\frac{n}{g^2}} \rfloor} \sum \limits_{i=d}^{\lfloor \sqrt{\frac{n}{dg^2}} \rfloor} \sum \limits_{j=i}^{\lfloor  \frac{n}{dig^2}\rfloor} [ijdg^2<=n] \\ &=& \sum \limits_{g=1}^{\sqrt{n}} \mu(g) \sum \limits_{d=1}^{\lfloor \sqrt[3]{\frac{n}{g^2}} \rfloor} \sum \limits_{i=d}^{\lfloor \sqrt{\frac{n}{dg^2}} \rfloor} (\lfloor \frac{n}{dig^2} \rfloor -i)*(3*[d==i]+6*[d!=i]) + ([d==i]+3*[d!=i])\end{array}$

  线性筛求莫比乌斯函数,然后枚举计算即可。

  时间复杂度约为$O(n^{\frac{2}{3}})$

原文地址:https://www.cnblogs.com/hz-Rockstar/p/11621308.html

时间: 2024-11-05 01:54:46

模拟测试57的相关文章

csp-s模拟测试57(10.2)「天空龙」&#183;「巨神兵」&#183;「太阳神」

题目是古埃及神话??? A. 天空龙 傻逼模拟,看来没有滑天下之大稽QAQ,也没有打错快读(大雾...) B. 巨神兵 难度爆增,一脸懵比..... 60分状压: 因为是求有向图,关于有向图好像拓扑用的很多,考虑到每个图的拓扑序是一定的 那么我们可以借此转移,设f[i][j]为当前点的状态为i,出度为零的点的度数为j 向下一层转移时枚举下一层的点集,那么点集S中每个点一定要和j连边,可以和i中除j以外的点连边 然后对于每个点cnt1,表示除j以外与i的连边,cnt2表示与j的连边,该点的贡献为2

CSP-S 模拟测试57题解

人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T2 巨神兵: 大神题,一看数据范围这么小,我们考虑状压,最傻逼的暴力思路是压边,但是这显然不行.正解是压点,设$f[s]$为当前选定点集状态为$s$的方案数. 我们考虑转移,当前选定的点集肯定是可以通过边和没有连过来的点相连构成新的方案.所以转移所以我们考虑枚举补集的子集$k$,设$cnt$为s与k

[考试反思]1002csp-s模拟测试57:平庸

一天两场,感觉要完. 不粘排行榜,太壮观了. #1:190 #2:180 #4:160 #35:150 #37:140 #39:120 #kx:20呃... 最后一个是考试结束后了. 又是CE盖40分.其实离#2不远... 调试语句没删干净,开O2编译出一条编译错误,没看,以为是那条关于scanf的warning. 然而并不是. 一定要仔细检查编译信息!!!交代码前一定要编译!!! 还有其实T1险些出锅,看错了题. 考试结束前7分钟重新看了一遍发现不对劲,+100pts. 看题!!! 要检查!!

csps模拟测试57

T1 天空龙 大神题,考察多方面知识,例如:快读 附上考试代码,以供后人学习 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 inline int read() 7 { 8 int x=0,f=1;char c=getchar(); 9 while(c<'0'||c>'9') {if

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci