Codeforces Good Bye 2023
A - 2023
直接乘起来显然会爆,但是每个数一定是 No
,否则就先补一个剩下的数,然后补 long long
。
B - Two Divisors
题目保证有解,那就很好办了。
首先如果
如果
C - Training Before the Olympiad
操作相当于求和后舍去
观察到,先后手轮流行动一次后,
D - Mathematical Problem
打个表,然后你会发现一个惊人的秘密:在
打表:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
vector<vector<ll>> ans;
map<ll,vector<ll>> mp;
void solve(int len,vector<ll> &res) {
ll liml=1,limr=1;
for(int i=1;i<len;++i) liml*=10;
limr=liml*10-1;
mp.clear();
for(int i=1;1ll*i*i<=limr;++i) {
if(1ll*i*i<liml) continue;
vector<int> d; ll tmp=1ll*i*i;
while(tmp) d.emplace_back(tmp%10),tmp/=10;
sort(d.begin(),d.end());
ll id=0;
for(auto v:d) id=id*10+v;
mp[id].emplace_back(1ll*i*i);
}
for(auto [id,vec]:mp) {
if(vec.size()>res.size()) res=vec;
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
ans.resize(12);
for(int i=1;i<=11;i+=2) {
solve(i,ans[i]);
}
cout<<"vector<vector<ll>> ans={";
for(int i=0;i<12;++i) {
if(i%2==0) {cout<<"{},"; continue;}
if(i<11) ans[i].resize(i);
else ans[i].resize(100);
ll b=ans[i].back(); ans[i].pop_back();
cout<<"{";
for(auto v:ans[i]) cout<<v<<",";
cout<<b<<"}";
if(i<11) cout<<",";
}
cout<<"};";
cout<<endl;
return 0;
}
E
题目明示我们枚举 LCA,于是考虑枚举 LCA,并在 LCA 向上提的时候动态更新子树信息(下面称题目里的 activity 为颜色)。
于是需要实现的操作就是:对一个到子树根的
子树查询提示我们把树按照 dfs 序拍平,于是子树查变成了区间查。考虑新加入一个颜色为
上述操作可以用支持区间加和区间
F
据说 Googleable,而且有 强化版。
G
据说出题人的做法都是假的
H
Googleable * 2: Gaussian_binomial_coefficient/q-binomial
照着 zaky 博客里的式子写就行了。
本文作者:xzm111
本文链接:https://www.cnblogs.com/xzmxzm/p/17937569/CF1916
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步