人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念。

题解:

T1 天空龙:

大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物。

T2 巨神兵:

大神题,一看数据范围这么小,我们考虑状压,最傻逼的暴力思路是压边,但是这显然不行。正解是压点,设$f[s]$为当前选定点集状态为$s$的方案数。

我们考虑转移,当前选定的点集肯定是可以通过边和没有连过来的点相连构成新的方案。所以转移所以我们考虑枚举补集的子集$k$,设$cnt$为s与k两个点集相连的边数,那么转移为$f[s|k]+=f[s]*2^{cnt}$?不,这样会算重,因为比如我们先加A点,再加B点,和先加B点,再加A点是一样的。所以考虑容斥,容斥系数为$(-1)^{size[k]+1}$,蒟蒻博主不会正着推,但是这个可以证明是对的。我们设$g[i]$为转移了$i$层的系数,那么显然$g[0]=1$,然后$g$的递推式为$g[i]=\sum_{j=1}^{i}{C_{j}^{i}*(-1)^{j+1}*g[i-j]}$,我们要证的是$g[i]=1$,首先$g[i-j]$可以消掉,因为你由3层转移到5层,和从0层转移到2层是一样的然后

    $\sum_{j=1}^{i}{C_j^i*(-1)^{j+1}}$

    $=(-1)*(\sum_{j=0}^{i}{C_j^i*(-1)^{j}}-C_j^0*(-1)^0)$

    $=(-1)*((1-1)^i-1)=1$    证毕。

然后转移用了很多预处理,主要是找两个点集相连的边,我们首先预处理每个点与之相连点的状态,将它与上当前枚举的补集就好,然后还要预处理的是,每个二进制数中1的个数和每个取出来的1,是第几位,然后dp就好了。

 #include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=,mod=1e9+;
int first[N],nex[N],to[N],tot,rc[N],sta[N],ma[],f[],n,m,qpow[N],re[N];
void add(int a,int b){
to[++tot]=b,nex[tot]=first[a],first[a]=tot;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=;i<=m;++i){
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y);
}
for(int i=;i<=(<<n);++i){
ma[i]=ma[i>>]+(i&);
}
// for(int i=1;i<=1<<n;++i) cout<<"ma["<<i<<"]=="<<ma[i]<<" ";cout<<endl;
f[]=qpow[]=;
for(int i=;i<=n*n;++i) qpow[i]=(qpow[i-]<<)%mod;
for(int i=;i<=n+;++i) rc[i]=(i&)?-:;
// for(int i=0;i<=n+1;++i) cout<<rc[i]<<" ";cout<<endl;
for(int i=;i<=n;++i){
re[<<i-]=i;
for(int j=first[i];j;j=nex[j]){
sta[i]|=<<to[j]-;
}
}
int Max=<<n,cnt=,maxn=Max-;
for(register int s=;s^Max;++s){register int kl=~s;
for(register int i=kl&maxn;i;i=(i-)&kl){
cnt=;
for(register int j=s;j;j-=j&-j) cnt+=ma[sta[re[j&-j]]&i];
// cout<<cnt<<" ";
// cout<<f[s]%mod*qpow[cnt]%mod<<" ";
(f[s|i]+=rc[ma[i]+]*f[s]%mod*qpow[cnt]%mod)%=mod;
}
}
printf("%lld\n",(f[maxn]+mod)%mod);
}

obelisk

T3 太阳神:

正难则反,lcm大于n的不好求,我们可以考虑求小于n的,即$n^2-\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{[lcm(i,j)<=n]}$

然后再转化$n^2-\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{[\frac{i\times j}{gcd(i,j)}<=n]}$,难点在于求后面的那部分,现在我们考虑枚举,$i,j$的最大公约数d,柿子就变成了$\sum\limits_{d=1}^{n}\sum\limits_{a=1}^{\frac{n}{d}}\sum\limits_{b=1}^{\frac{n}{d}}{[gcd(a,b)==1][a\times b\leq \frac{n}{d}]}$

我们考虑求$f_k=\sum\limits_{1\leq a,b\leq n}{[a\times b\leq k][gcd(a,b)==1]}$,我们设$S_k=\sum\limits_{1\leq a,b\leq n}{[a\times b\leq k]}$,这一个数论分块就可以求出,那么$f_k=S_k-\sum\limits_{t>1} f_{\frac{k}{t^2}}$,前面S函数是不考虑gcd为1的条件的,后面的t相当于是枚举a,b的因子,同时把a,b因子提出即可得到$\frac{k}{t^2}$,然后就是关于f函数的求法,把它差分一下得到g[k],那么g[k]的含义就是$\sum\limits [a\times b=k][gcd(a,b)=1]$的a,b对数

$g[k]=2^cnt$,cnt为k的质因子种数,因为每种质因子,只能全部给a或b,而不能一部分给a,一部分给b,因为那样的话$gcd(a,b)$就不是1,这样f线筛即可,当n较小时直接用线筛筛出来的,当n较大时用上面提到的方法迭代即可。最外层数论分块,时间复杂度O(玄学)$O(n^{\frac{2}{3}})$

 #include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7+,mod=1e9+;
int v[N],prime[N],num,f[N],n;
void init(){
f[]=;
for(int i=;i<=;++i){
if(!v[i]){
prime[++num]=i;
f[i]=;
v[i]=;
}
for(int j=;j<=num&&i*prime[j]<=;++j){
v[i*prime[j]]=;
if(i%prime[j]==){
f[i*prime[j]]=f[i];
break;
}
f[i*prime[j]]=f[i]*f[prime[j]]%mod;
// cout<<f[i]<<" "<<f[prime[j]]<<" "<<f[i*prime[j]]<<endl;
}
}
}
int calS(int x){
int ans=;
for(int l=,r;l<=x;l=r+){
r=x/(x/l);
(ans+=(r-l+)*(x/l)%mod)%=mod;
}
return ans;
} int calF(int x){//cout<<x<<" "<<endl;
if(x<=) return f[x];
int ans=;
ans=calS(x)%mod;
for(int i=;i*i<=x;++i){
(((ans-=calF(x/(i*i))+mod)%=mod)+=mod)%=mod;
}
return ans;
} signed main(){
scanf("%lld",&n);
init();
//for(int i=1;i<=20;++i) cout<<"f["<<i<<"]=="<<f[i]<<" ";cout<<endl;
for(int i=;i<=;++i) (f[i]+=f[i-])%=mod;
int ans=(n%mod*(n%mod))%mod;
for(int i=,r;i<=n;i=r+){
r=n/(n/i);
// cout<<ans<<" ";
// cout<<i<<" "<<r<<endl;
(((ans-=calF(n/i)%mod*(r-i+)%mod+mod)%=mod)+=mod)%=mod;
// cout<<calF(n/i)%mod*(r-i+1)%mod+mod<<endl;
}
printf("%lld",(ans+mod)%mod);
}

ra

CSP-S 模拟测试57题解的更多相关文章

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

    一天两场,感觉要完. 不粘排行榜,太壮观了. #1:190 #2:180 #4:160 #35:150 #37:140 #39:120 #kx:20呃... 最后一个是考试结束后了. 又是CE盖40分 ...

  2. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  3. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  4. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  5. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

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

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

  7. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

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

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

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

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

随机推荐

  1. 【Python基础】11_Python中的字符串

    1.字符串的定义 可以使用""双引号,也可以使用''单引号定义字符串,一般使用双引号定义. 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.ce ...

  2. 学习GTK+ (1) ——编写helloworld

    环境 我使用的是新安装的manjaro 18.1 (kde版),安装新系统后后直接可以开始写代码,不需要安装各种调用的库等. 推荐一个网站,gnome开发者 https://developer.gno ...

  3. APP安全测试之安装/卸载/更新测试

    在app测试中,有个不可忽视的测试方向,就是安装.卸载和更新,有很多人问到了这个问题,我就在这里做了一个总结,有补充的请留言哦 安装 1.正常安装测试,检查是否安装成功. 2.APP版本覆盖测试.例如 ...

  4. vue采坑之——vue里面渲染html 并添加样式

    在工作中,有次遇到要把返回的字符串分割成两部分,一部分用另外的样式显示. 这时候,我想通过对得到字符串进行处理,在需要特别样式的字符串片段用html标签(用的span)包裹起来再通过变量绑定就好了.不 ...

  5. winfrom 保存图片

    private void btnSave_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); ...

  6. 适配方案(五)适配的基础知识之设备像素比 dpr 与 1px 物理像素

    设备像素比 dpr 与 1px 物理像素 物理像素(physical pixel) 手机屏幕上显示的最小单元,该最小单元具有颜色及亮度的属性可供设置,iphone6.7.8 为:750 * 1334, ...

  7. Django 之form简单应用

    form组件 参考链接:https://www.cnblogs.com/maple-shaw/articles/9537309.html form组件的作用: 1.自动生成input框 2.可以对数据 ...

  8. 使用LEANGOO泳道

    转自:https://www.leangoo.com/leangoo_guide/leangoo_yongdao.html 列表使用纵向的纬度管理卡片,通常代表卡片的工作的不同阶段,或者任务的状态.泳 ...

  9. 使用JPA完成增删改查操作

    基础的增删改查操作如下: package cn.itheima.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUt ...

  10. oracle to_Char fm 函数

    近期在使用oracle to_char函数处理浮点数时发现有坑,这里做个小结: 网上可以找到关于to_char中使用fm9990.0099中的相关解释: 0表示:如果参数(double或者float类 ...