AtCoder Beginner Contest 445
个人题解
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
首先应该注意到的是 ,也就是说每个点只会往右传。看不到这个条件这题就会很复杂。
这样最后一个元素只能传给自己,所以这个传递一定是能停下来的,且要进行的次数很多,所以可以认为只在自己传给自己的位置停下来。
从右往左扫一遍,如果 ,那么从这个点出发的答案就是 ,否则继承 对应点的答案,此时它一定被求出来了。
#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
设 为整个序列涉及的所有质数,质数 有一个指数序列 ,表示 中 的系数。
那么序列的 可以刻画为
如果序列中去掉 ,我们就把其涉及的质数改一下指数就行。具体地,维护每个质数对应的最大指数。由于 ,所以这个维护的东西值也能用int存下来,这样就避过快速幂了。扫一遍,对于每个 ,将其分解质因数。 可能有点紧,线性筛一遍预处理每个数的最小质因子,这样能做到 。如果 中某个质数对应次幂小于全局最大值,那么无视掉,否则换上非严格次大值就行。
#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;}觉得这篇文章怎么样?
点个赞,让更多人看到!

评论区