【学习笔记】2021.10.5 - 清北学堂模拟赛
T1 一
正解
暴力。
超级加倍版(n提升至1e5)
预处理 1~n 的逆元,然后
(以上为赛时手推出来的屑QWQ)
竖着求一遍,得到每个数的贡献。
然后就会发现一个垃圾规律:从1~,每一行的值在有规律地增加,根据这个规律直接计算每个数的贡献倍数即可。
代码
蒟蒻的屑代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef long long ll;
const ll MO(1000000007);
ll n,num[1233],sum[1233],ans;
inline ll R(){
ll x=0,f=1;char c='c';
while(c>'9'||c<'0'){f=(c=='-')?-1:1;c=getchar();}
while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
return x*f;
}
inline ll fpow(ll x,ll y){
ll res=1;
while(y){
if(y&1) res=(res*x)%MO;
x=(x*x)%MO;
y>>=1;
}
return res;
}
inline ll FENSHU(ll fz,ll fm){return fz*fpow(fm,MO-2)%MO;}
inline ll ges(ll l,ll r){
ll res=0;
for(register int i=l;i<=r;++i) res=(res+FENSHU(1,i))%MO;
res=(res+sum[l-1])%MO;
return res;
}
int main(){
n=R();
for(register int i=1;i<=n;++i) num[i]=R();
for(register int i=1,j=n;i<=j;i++,j--) sum[i]=sum[j]=ges(i,j);
for(register int i=1;i<=n;++i) ans=(ans+sum[i]*num[i]%MO)%MO;
printf("%lld\n",ans);
return 0;
}
/*
a b c d e
1/1 1/1 1/1 1/1 1/1
1/2 2/2 2/2 2/2 1/2
1/3 2/3 3/3 2/3 1/3
1/4 2/4 2/4 2/4 1/4
1/5 1/5 1/5 1/5 1/5
a b c d e f
1/1 1/1 1/1 1/1 1/1 1/1
1/2 2/2 2/2 2/2 2/2 1/2
1/3 2/3 3/3 3/3 2/3 1/3
1/4 2/4 3/4 3/4 2/4 1/4
1/5 2/5 2/5 2/5 2/5 1/5
1/6 1/6 1/6 1/6 1/6 1/6
*/
T2
正解
使用1、2、10构造即可,先找到最大的小于等于m的等差数列的某一项,再将其中的若干位修改为1,使其与10形成回文数字。
不难证明,这若干个2的个数一定大于等于仍缺少的数对,设有x个2,则如果不足以填满,说明剩下的个数要比要大,因此找到的最大的这一项不会是此项,与已知条件矛盾。
剩下的空余部分填充1145即可(数字多臭是不影响答案的)。
代码
更屑的代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int T,n,m,num[2333];
long long res,qwq;
int main(){
scanf("%d",&T);
for(register int i=2;i<=1010;++i) num[i]=num[i-1]+i-1;
while(T--){
scanf("%d%d",&n,&m);res=qwq=0;
for(register int i=1;;++i) if((num[i]<=m)&&(num[i+1]>m)){qwq=m-num[i];res=i;break;}
res=res-qwq;
for(register int i=1;i<=qwq;++i) printf("1 ");
for(register int i=1;i<=res;++i) printf("2 ");
n-=qwq;n-=res;
if(n){printf("10 ");n--;}
for(register int i=1;i<=n;++i){printf("1145 ");}
printf("\n");
}
return 0;
}
T3
正解
因为只需要记最大数值,所以考虑从大到小把点加入。
对于这个点连接的若干连通块,显然这些连通块合并以后,长度为1~直径的所有值都会被这个点作贡献。
但是怎么求连通块的直径呢?
实际上,合并连通块时,直径一定会出现在构成两个连通块的直径的四个点的任意组合中,所以跑4遍倍增LCA,即可求得直径。
代码
莫得。/kk
T4
Subtask1 - 40 pts
暴力。
可惜时间不够没有写TAT
Subtask2 - 10 pts(a=b=c=0)
只有一个d,所以输出 即可(所有子集)
Subtask3 - 20 pts(a=b=0)
对于每条边,显然如果该边想贡献答案,则两个端点都必须选上,剩余方案为 ,所以将每条边乘上 ,再加上 即可。
Subtask4 - 20 pts(a=0)
平方项本质上就是从原图中选两条边的方案数。
但是,不要大e,这两条边可能是一条边!
当两条边为同一条边时
答案为,因为对于每一条边,都可以转化为上一个Subtask处理。
当两条边不为同一条边时
当两条边完全独立时
答案为,其中d[v]表示v点的度,此指对于每个点选择两条边的方案数,后面2的次幂表示定死三个点,剩下的随便选的方案数。
当有一个公共端点时
总方案除去以上两种情况的方案数(不含2的某次幂)再乘得到最终方案。
正解
要用到数三元环,可惜我不会QWQ
代码
还是莫得QWQ。
zhxの合理の难度评价
T1 = <T1
T2 = Strange T2
T3 = T3
T4 = T4
看来我果然是大ZZ,什么也不会QWQ
没救了TAT
本文作者:Binaries
本文链接:https://www.cnblogs.com/Konjac-Binaries/p/15368571.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具