AtCoder Beginner Conest 284 解题报告
AtCoder Beginner Conest 284 解题报告
\(\text{By DaiRuiChen007}\)
A. Sequence of Strings
模拟,时间复杂度 \(\Theta(n)\)
#include<bits/stdc++.h>
using namespace std;
signed main() {
int n;
cin>>n;
vector <string> v(n);
for(int i=n-1;i>=0;--i) cin>>v[i];
for(auto p:v) cout<<p<<"\n";
return 0;
}
B. Multi Test Cases
模拟,时间复杂度 \(\Theta(Tn)\)
#include<bits/stdc++.h>
using namespace std;
signed main() {
int T;
scanf("%d",&T);
while(T--) {
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;++i) {
int a;
scanf("%d",&a);
if(a%2==1) ++ans;
}
printf("%d\n",ans);
}
return 0;
}
C. Count Connected Components
dfs 标记,时间复杂度 \(\Theta(n+m)\)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=301;
vector <int> G[MAXN];
bool vis[MAXN];
inline void dfs(int p) {
vis[p]=true;
for(int v:G[p]) if(!vis[v]) dfs(v);
}
signed main() {
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) {
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;++i) if(!vis[i]) ++ans,dfs(i);
printf("%d\n",ans);
return 0;
}
D. Happy New Year 2023
枚举 \(\min(p,q)\),注意到 \(\min(p,q)\) 应该是 \(\sqrt[3]n\) 级别的,因此时间复杂度 \(\Theta(T\sqrt[3]n)\)
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int sqr(int x) {
int k=sqrt(x);
for(int ret=k-10;ret<=k+10;++ret) {
if(k<0) continue;
if(k*k==x) return k;
}
return -1;
}
inline void solve() {
int n;
scanf("%lld",&n);
for(int i=2;i*i*i<=n;++i) {
if(n%i==0) {
if(n%(i*i)==0) printf("%lld %lld\n",i,n/(i*i));
else printf("%lld %lld\n",sqr(n/i),i);
return ;
}
}
}
signed main() {
int T;
scanf("%lld",&T);
while(T--) solve();
return 0;
}
E. Count Simple Paths
大力 dfs,搜索的时候用数组记录一下每个点是否已经在路径中即可
注意到每次搜到一个点后答案会 \(+1\),因此最多访问 \(10^6\) 个点,而每搜到一个点至多遍历与其相邻的 \(10\) 个点
时间复杂度 \(\Theta(k\deg(v))\),其中 \(k=\min(10^6,\text{ans})\),\(\deg(v)\) 表示最大度数
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+1,LIM=1e6;
int ans=0;
vector <int> G[MAXN];
bool inq[MAXN];
inline void dfs(int p) {
inq[p]=true;
++ans;
if(ans==LIM) {
printf("%d\n",LIM);
exit(0);
}
for(int v:G[p]) if(!inq[v]) dfs(v);
inq[p]=false;
}
signed main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) {
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1);
printf("%d\n",ans);
return 0;
}
F. ABCBAC
对原序列做从左至右和从右至左的字符串哈希,对于每个 \(i\) 计算哈希值并比较即可
时间复杂度 \(\Theta(n)\)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e6+1,BASE=13331,MOD=998244353;
char str[MAXN],rev[MAXN];
int p[MAXN],s[MAXN][2];
inline int q(int l,int r,int op) {
return (s[r][op]+MOD-s[l-1][op]*p[r-l+1]%MOD)%MOD;
}
signed main() {
int n;
scanf("%lld%s",&n,str+1);
for(int i=1;i<=2*n;++i) rev[i]=str[2*n-i+1];
p[0]=1;
for(int i=1;i<=2*n;++i) {
p[i]=p[i-1]*BASE%MOD;
s[i][0]=(s[i-1][0]*BASE+str[i]-'a')%MOD;
s[i][1]=(s[i-1][1]*BASE+rev[i]-'a')%MOD;
}
for(int i=0;i<=n;++i) {
if((q(1,i,0)*p[n-i]%MOD+q(n+i+1,2*n,0))%MOD==q(n-i+1,2*n-i,1)) {
for(int j=1;j<=i;++j) printf("%c",str[j]);
for(int j=n+i+1;j<=2*n;++j) printf("%c",str[j]);
printf("\n%lld\n",i);
return 0;
}
}
puts("-1");
return 0;
}
G - Only Once
考虑在所有的 \((a_i,i)\) 之间连边,我们能够得到一棵基环树,而 \(s_i\) 事实上就是 \(i\) 到基环树中环的距离
我们可以把 \(s_i\) 理解为一条长度为 \(s_i\) 的链接一个环,考虑拆贡献,对于每个 \(1\sim n\) 的 \(k\),我们统计有多少种情况使得图中有一个恰好长度为 \(k\) 的链
首先确定长度为 \(k\) 的链,我们先从 \(n\) 个数里任选 \(k\) 个,然后对其进行排列,得到这一步的方案数为 \(\binom nk\times k!\) 种
而在确定了链之后,我们要在链的后面接一个环,假设其长度为 \(j\),我们同样在剩下的 \(n-k\) 个数里任选 \(j\) 个然后进行排列,不过注意到不同的点与链相连算不同的方案,因此此处的排列方案数为 \(j\times(j-1)!\) 种,总方案数为 \(\binom {n-k}j\times j!\)
而剩下的 \(n-k-l\) 个点随意选择连接的节点,方案数 \(n^{n-k-l}\)
因此我们得到答案的表达式:
\text{answer}
&=\sum_{k=0}^n k\times\binom nk\times k!\times\sum_{j=1}^{n-k} \binom{n-k}j\times j!\times n^{n-k-j}\\
&=\sum_{k=0}^n\sum_{j=1}^{n-k} k\times\binom nk\times k!\times\binom{n-k}j\times j!\times n^{n-k-j}\\
&=\sum_{k=0}^n\sum_{j=1}^{n-k}k\times\dfrac{n!}{k!\times(n-k!)}\times k!\times\dfrac{(n-k)!}{j!(n-k-j)!}\times j!\times n^{n-k-j}\\
&=\sum_{(j+k)=1}^n\sum_{k=0}^{(j+k)-1} k\times \dfrac{n!}{(n-j-k)!}\times n^{n-j-k}\\
&=\sum_{i=1}^n \dfrac{n!}{(n-i)!}\times n^{n-i}\times\sum_{k=0}^{i-1}k\\
&=\sum_{i=1}^n\dfrac{n!}{(n-i)!}\times n^{n-i}\times \dfrac{i\times(i-1)}2
\end{aligned}
\]
其中在化简的过程中我们令 \(i=j+k\) 方便表达
注意到 \(\dfrac{n!}{(n-i)!}\) 可以在递推预处理得到,因此时间复杂度为 \(\Theta(n\log n)\),\(\Theta(\log n)\) 为快速幂复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+1;
int f[MAXN];
inline int ksm(int a,int b,int m) {
int ret=1;
while(b) {
if(b&1) ret=ret*a%m;
a=a*a%m;
b=b>>1;
}
return ret;
}
signed main() {
int n,mod,ans=0;
scanf("%lld%lld",&n,&mod);
f[n]=1;
for(int i=n;i>=1;--i) f[i-1]=f[i]*i%mod;
for(int k=1;k<=n;++k) ans=(ans+k*(k-1)/2%mod*ksm(n,n-k,mod)%mod*f[n-k]%mod)%mod;
printf("%lld\n",ans);
}
AtCoder Beginner Conest 284 解题报告的更多相关文章
- AtCoder Beginner Contest 285 解题报告
AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...
- AtCoder Beginner Contest 122 解题报告
手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...
- AtCoder Beginner Contest 146解题报告
题目地址 https://atcoder.jp/contests/abc146/tasks 感觉没有什么有意思的题... 题解 A #include <bits/stdc++.h> usi ...
- Atcoder Beginner Contest 124 解题报告
心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...
- AtCoder Beginner Contest 118 解题报告
A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...
- AtCoder Beginner Contest 120 解题报告
为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...
- AtCoder Beginner Contest 117 解题报告
果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include& ...
- AtCoder Beginner Contest 132 解题报告
前四题都好水.后面两道题好难. C Divide the Problems #include <cstdio> #include <algorithm> using names ...
- AtCoder Beginner Contest 129 解题报告
传送门 写了四个题就跑去打球了.第五题应该能肝出来的. A - Airplane #include <bits/stdc++.h> using namespace std; inline ...
随机推荐
- Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】(2022/8/30)
插槽Vue.js官网介绍:https://vuejs.org/guide/components/slots.html 会牵涉到template的用法.占位.实际不渲染到页面中 1.默认插槽: 1.1 ...
- 知识图谱-生物信息学-医学论文(BMC Bioinformatics-2022)-挖掘阿尔茨海默病相关KG来确定潜在的相关语义三元组用于药物再利用
论文标题: Mining On Alzheimer's Diseases Related Knowledge Graph to Identity Potential AD-related Semant ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
- mybatis一对多映射分页的问题
一对多可能会出现分页错误 条数不对的问题 解决方法: 将主表分页查询一次 SELECT aa.id,aa.name,bb.name FROM (SELECT * from tab1 ORDER BY ...
- 高精度加法(Java)
题目描述 高精度加法,相当于 a+b problem,不用考虑负数. 输入格式 分两行输入. a , b ≤ 10^500 输出格式 输出只有一行,代表 a + b 的值. 思路 使用数组进行模拟, ...
- 2022春每日一题:Day 30
题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过 ...
- kubeedge架构与核心设计---https://bbs.huaweicloud.com/webinar/100009
今天是kubeedge的第一节课,今天主要带大家回顾一下云原生和边缘计算的发展历程 然后我们会重点介绍一下kubeedge这个项目,他的设计背景和核心理念与我们整体的架构 首先是我们来简单回归一下云原 ...
- openstack单机部署 未完成
注:centos8单机版 注:本次实验手动配置密码均为admin 环境准备:配置hosts文件 192.168.116.85为本机IP echo '192.168.116.85 controller ...
- 深度学习之logistics回归
在开始之前,事先声明本文参考[中文][吴恩达课后编程作业]Course 1 - 神经网络和深度学习 - 第二周作业_何宽的博客-CSDN博客_吴恩达课后编程作业 加上自己的理解,希望可以不用重复看吴恩 ...
- linux sublime-text ctrl+shift+b 快捷键失效问题解决
解决办法 由于fcitx拦截了这个ctrl+shift+b 这个快捷键,所以取消即可 点击全局配置里面高级选项,然后找到ctrl+shift+b这个快捷键,点击后,按esc就可以将快捷键设置为空,不过 ...