七海ノ心象素描

所有的为时已晚都是恰逢其时

Nanami^2 avatar

Author

Nanami^2

大一学生 | 不是很聪明的样子

Telegram

我的频道

不定期推送灵感笔记

t.me/kisanami_blog
联系方式
QQ 群
1072614878
发送邮件

AtCoder Beginner Contest 445

个人题解

Nanami^2
Nanami^2 Even in the rain.
2026年02月14日
预计阅读 7 分钟
1308 字

A

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define SET(a,b) memset(a,b,sizeof(a))
#define CPY(a,b) memcpy(a,b,sizeof(b))
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define per(i,j,k) for(int i=(j);i>=(k);--i)
int read() {
int a=0, f=1; char c=getchar();
while(!isdigit(c)) {
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)) a=a*10+c-'0', c=getchar();
return a*f;
}
signed main() {
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
string s;
cin >> s;
if(s[0] == s[s.size() - 1]) puts("Yes");
else puts("No");
return 0;
}

B

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define SET(a,b) memset(a,b,sizeof(a))
#define CPY(a,b) memcpy(a,b,sizeof(b))
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define per(i,j,k) for(int i=(j);i>=(k);--i)
int read() {
int a=0, f=1; char c=getchar();
while(!isdigit(c)) {
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)) a=a*10+c-'0', c=getchar();
return a*f;
}
int n, m;
string s[105];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++) {
cin >> s[i];
m = max(m, (int)s[i].size());
}
for(int i = 1;i <= n;i++) {
int cnt = (m - s[i].size()) / 2;
for(int j = 1;j <= cnt;j++) cout << ".";
cout << s[i];
for(int j = 1;j <= cnt;j++) cout << ".";
cout << endl;
}
return 0;
}

C

首先应该注意到的是 iAiNi \le A_i \le N,也就是说每个点只会往右传。看不到这个条件这题就会很复杂。

这样最后一个元素只能传给自己,所以这个传递一定是能停下来的,且要进行的次数很多,所以可以认为只在自己传给自己的位置停下来。

从右往左扫一遍,如果 Ai=iA_i = i,那么从这个点出发的答案就是 ii,否则继承 AiA_i 对应点的答案,此时它一定被求出来了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define SET(a,b) memset(a,b,sizeof(a))
#define CPY(a,b) memcpy(a,b,sizeof(b))
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define per(i,j,k) for(int i=(j);i>=(k);--i)
int read() {
int a=0, f=1; char c=getchar();
while(!isdigit(c)) {
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)) a=a*10+c-'0', c=getchar();
return a*f;
}
const int N = 5e5 + 5;
int n, a[N], res[N];
signed main() {
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
for(int i = n; i >= 1; --i) {
if (a[i] == i) res[i] = i;
else res[i] = res[a[i]];
}
for(int i = 1; i <= n;i++) {
cout << res[i] << " ";
}
cout << endl;
return 0;
}

D

没写。

E

mm 为整个序列涉及的所有质数,质数 PiP_i 有一个指数序列 {ej}\{e_j\},表示 AjA_jPiP_i 的系数。

那么序列的 lcm\text{lcm} 可以刻画为

i=1mPimaxj=1n{ej}\prod_{i = 1}^m P_i^{\max_{j = 1}^{n} \{e_j\}}

如果序列中去掉 AiA_i,我们就把其涉及的质数改一下指数就行。具体地,维护每个质数对应的最大指数。由于 Ai107A_i \le 10^7,所以这个维护的东西值也能用int存下来,这样就避过快速幂了。扫一遍,对于每个 AiA_i,将其分解质因数。O(nAi)O(n \sqrt{A_i}) 可能有点紧,线性筛一遍预处理每个数的最小质因子,这样能做到 O(maxi=1n{Ai}+nlogn)O(\max_{i = 1}^n \{ A_i \} + n \log n)。如果 AiA_i 中某个质数对应次幂小于全局最大值,那么无视掉,否则换上非严格次大值就行。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define SET(a,b) memset(a,b,sizeof(a))
#define CPY(a,b) memcpy(a,b,sizeof(b))
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define per(i,j,k) for(int i=(j);i>=(k);--i)
int read() {
int a=0, f=1; char c=getchar();
while(!isdigit(c)) {
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)) a=a*10+c-'0', c=getchar();
return a*f;
}
const int mod = 998244353, N = 2e5 + 5, lim = 1e7 + 5;
int T, n, a[N];
int tot, pr[lim];
bool v[lim], vis[lim];
int minp[lim], e[lim][2], cnt[lim];
vector<int> p;
ll fp(ll a, ll b) {
ll res = 1;
a %= mod;
while(b) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll inv(ll n) { return fp(n, mod - 2); }
void shai() {
for(int i = 2; i <= 1e7;i++) {
if(!v[i]) pr[++tot] = i, minp[i] = i;
for(int j = 1;j <= tot && i * pr[j] <= 1e7;j++) {
v[i * pr[j]] = 1;
minp[i * pr[j]] = pr[j];
if(i % pr[j] == 0) break;
}
}
}
void solve() {
p.clear();
cin >> n;
for (int i = 1;i <= n;i++) {
cin >> a[i];
int x = a[i];
while (x > 1) {
int _p = minp[x];
int _e = 1;
if(!vis[_p]) {
p.push_back(_p);
vis[_p] = 1;
}
while (x % _p == 0) {
_e *= _p;
x /= _p;
}
if (_e > e[_p][0]) {
e[_p][1] = e[_p][0];
e[_p][0] = _e;
} else if (_e > e[_p][1]) {
e[_p][1] = _e;
}
}
}
ll LCM = 1;
for(auto x : p) {
if(e[x][0] > 0) {
(LCM *= e[x][0]) %= mod;
}
}
for(int i = 1; i <= n;i++) {
ll ans = LCM;
int x = a[i];
while(x > 1) {
int _p = minp[x];
int _e = 1;
while(x % _p == 0) {
_e *= _p;
x /= _p;
}
if(_e != e[_p][0]) continue;
(ans *= inv(e[_p][0])) %= mod;
if(e[_p][1] > 0) (ans *= e[_p][1]) %= mod;
}
cout << ans << " ";
}
cout << endl;
for(int x : p) {
e[x][0] = e[x][1] = vis[x] = 0;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
shai();
cin >> T;
while(T--) solve();
return 0;
}

觉得这篇文章怎么样?

点个赞,让更多人看到!

分享这篇文章

知识因分享而增值

分类

比赛
AtCoder

标签

数论
DP

版权声明:本文作者为 Nanami^2,首发于nanami7.top

遵循 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

评论区

本评论区由 EveSunMaple 自主开发