2024.11.23 CodeTON Round 9 (Div. 1 + Div. 2)
Solved:6/11
Rank:135
感觉 F 差一步就做出来了。。。
A. Shohag Loves Mod
题意:给
#include<bits/stdc++.h> using namespace std; void solve(){ int n; cin>>n; for(int i=1;i<=n;++i)cout<<i*2-1<<' '; cout<<'\n'; } int main(){ ios::sync_with_stdio(0);cin.tie(0); int T; cin>>T; while(T--)solve(); }
B. Shohag Loves Strings
题意:给一个字符串,求任意一个子串使得本质不同子串数量为偶数。
注意到 aa
和 abc
的本质不同子串数都是偶数,而不存在这类子串的字符串只有形如 abababab...
,其所有子串的本质不同子串数均为奇数。
#include<bits/stdc++.h> using namespace std; void solve(){ string a; cin>>a; int n=a.length(); for(int i=0;i<n-1;++i)if(a[i]==a[i+1]){cout<<a[i]<<a[i+1]<<'\n';return;} bool fl=0; for(int i=2;i<n;++i)if(a[i]!=a[i&1])fl=1; if(!fl){cout<<"-1\n";return;} for(int i=0;i<n-2;++i)if(a[i]!=a[i+1]&&a[i]!=a[i+2]&&a[i+1]!=a[i+2]){cout<<a[i]<<a[i+1]<<a[i+2]<<'\n';return;} } int main(){ ios::sync_with_stdio(0);cin.tie(0); int T; cin>>T; while(T--)solve(); }
C1. Shohag Loves XOR (Easy Version)
题意:给定
当
#include<bits/stdc++.h> using namespace std; typedef long long ll; void solve(){ int x; ll n; cin>>x>>n; int m=1; while(m<=x)m<<=1; m=min((ll)m,n); int cnt=0; for(int i=1;i<=m;++i)if(i!=x){ if(!(x%(x^i))||!(i%(x^i)))++cnt; } cout<<cnt<<'\n'; } int main(){ ios::sync_with_stdio(0);cin.tie(0); int T; cin>>T; while(T--)solve(); }
C2. Shohag Loves XOR (Hard Version)
题意:给定
和 C1 类似,当
#include<bits/stdc++.h> using namespace std; typedef long long ll; void solve(){ int x; ll n; cin>>x>>n; int m=1; while(m<=x)m<<=1; if(m>=n){ ll cnt=0; for(int i=1;i<=n;++i){ if(!((x^i)%i)||!((x^i)%x))++cnt; } cout<<cnt<<'\n'; return; } ll cnt=0; for(int i=1;i<m;++i){ if(!((x^i)%i)&&(x^i)%x)++cnt; } ll l=n^(n&(m-1)),r=l+m; cnt+=(l-1)/x; for(ll y=(l-1)/x*x+x;y<r;y+=x){ if((x^y)<=n)++cnt; } cout<<cnt<<'\n'; } int main(){ ios::sync_with_stdio(0);cin.tie(0); int T; cin>>T; while(T--)solve(); }
D. Shohag Loves GCD
题意:给定
设整数
证明:此时一定存在下标序列
而另一方面,当
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define all(x) (x).begin(),(x).end() const int N=1e5+5; bool np[N]; int pri[N],cnt,f[N],mx[N]; void sieve(int n){ for(int i=2;i<=n;++i){ if(!np[i])pri[++cnt]=i,f[i]=1; for(int j=1;j<=cnt&&i*pri[j]<=n;++j){ np[i*pri[j]]=1; f[i*pri[j]]=f[i]+1; if(!(i%pri[j]))break; } } for(int i=1;i<=n;++i)mx[i]=max(f[i],mx[i-1]); } void solve(){ int n,m; cin>>n>>m; vector<int> a(m); for(int i=0;i<m;++i)cin>>a[i]; if(m<=mx[n]){cout<<"-1\n";return;} sort(all(a)),reverse(all(a)); for(int i=1;i<=n;++i)cout<<a[f[i]]<<' '; cout<<'\n'; } int main(){ sieve(1e5); ios::sync_with_stdio(0);cin.tie(0); int T; cin>>T; while(T--)solve(); }
E. Shohag Loves Inversions
题意:初始序列为
插入一个数字在绝大多数情况下都会使序列的逆序对数增加。事实上,除了前几次操作插入
设
-
新的数字是
且插入在前面:手玩可知逆序对数为 的序列只能形如 ,能构成的新序列总数为 ; -
新的数字
且插入在前面:由于此时末尾的数都不再是和下次插入相等的数,所以要考虑前面有 到 个数的情形,方案总数为 。 -
新的数字
且插入在末尾:没有贡献。
因此
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define all(x) (x).begin(),(x).end() const int N=1e6+5,mod=998244353; int n=1e6; ll f[N]; int main(){ ios::sync_with_stdio(0);cin.tie(0); f[1]=0,f[2]=0,f[3]=2; ll sum=8; for(int i=4;i<=n;++i){ f[i]=(1ll*(i-2)*(i+1)/2+sum)%mod; sum=(sum+f[i]*(i+1))%mod; } for(int i=4;i<=n;++i)f[i]=(f[i]+f[i-1])%mod; int T; cin>>T; while(T--)cin>>n,cout<<(n-1+f[n-1])%mod<<'\n'; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!