CodeTON Round 9 (Div. 1 + Div. 2)
CodeTON Round 9 (Div. 1 + Div. 2) 总结
A
自己推一下就能出来的,输出奇数即可。
因为要递增,所以尽可能取小的数字。
,余数肯定是 ,尽可能小,所以 。 ,余数尽可能小且不重,是 ,所以 ,余数为 , 。
这样推导后知道
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=55;
int n;
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cout<<i*2-1<<' ';
cout<<'\n';
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
B
肯定是往数量少的考虑。
,显然只有一个非空子串。 。- 当两个字符不同时,一定有三个子串,不符。
- 当两个字符相同时,会有两个不同的子串,符合题意。
。只有三个字符都不同时,才会有 个不同的子串。
所以就是找连续的三个不同的字符或者两个相同的字符。这样思考一下,只有出现类似于 ababababa
这样的字符才没有子串符合条件。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e5+5;
string s;
void solve()
{
cin>>s;
int n=s.size();
for(int i=0;i<n-2;i++)
if(s[i]!=s[i+1]&&s[i]!=s[i+2]&&s[i+1]!=s[i+2])
{
cout<<s[i]<<s[i+1]<<s[i+2]<<'\n';
return ;
}
for(int i=0;i<n-1;i++)
if(s[i]==s[i+1])
{
cout<<s[i]<<s[i+1]<<'\n';
return ;
}
cout<<-1<<'\n';
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
C1
C 题都用到了一个性质,按位异或可以看作是不进位的加法。设
因此当
所以
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1;
int x;
ll m;
void solve()
{
cin>>x>>m;
ll n=1,cnt=0;
while(n<=x) n<<=1;
for(int y=1;y<=min(n-1,m);y++)
{
int t=x^y;
if(t==0) continue;
if(x%t==0||y%t==0) cnt++;
}
cout<<cnt<<'\n';
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
C2
可以先打表找规律,发现小于
设
按位异或可以看作是不进位的加法,所以当
所以只考虑
再考虑
还剩下一段区间为
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1;
ll x,m;
void solve()
{
cin>>x>>m;
ll ans=0,t;
if(m>x)
{
ans+=max((m-x)/x-1,0ll);
t=m/x*x;
ll y=x^t;
if(y>x&&y<=m) ans++;
t+=x,y=x^t;
if(y>x&&y<=m) ans++;
}
for(int y=1;y<=min(x,m);y++)
{
t=x^y;
if(t%y==0) ans++;
}
cout<<ans<<'\n';
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
D
感觉上比 C2 简单。
先转变下条件,若
开始构造,将
,所以 的所有 都有 ,所以不妨让 为最大,为 。然后 的所有 都不能是 。 ,确定为 ,能影响到 ,这些都不能是 。 ,可以为 ,影响到 ,这些不能是 。 可以为 , 可以为 , 可以为 。
就这么推下去,找到
枚举次数为
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m;
int s[N],a[N];
bool cmp(int x,int y)
{
return x>y;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>s[i];
sort(s+1,s+m+1,cmp);
for(int i=1;i<=n;i++) a[i]=0;
a[1]=1;
int mx=0;
for(int i=1;i<=n;i++)
for(int j=i*2;j<=n;j+=i)
{
a[j]=max(a[j],a[i]+1);
mx=max(mx,a[j]);
}
if(mx>m)
{
cout<<-1<<'\n';
return ;
}
for(int i=1;i<=n;i++) cout<<s[a[i]]<<' ';
cout<<'\n';
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」