CF1780
A.Hayato and School
题目大意:
共YES
并输出它们在序列NO
。
解题思路:
众所周知,若两个数的和是奇数,那么它们一定一个是偶数,一个是奇数;再进一步,若三个数的和是奇数,那么它们不是偶偶奇,就是奇奇奇。于是统计一下序列
贴
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=310;
int T;
int n,a[N];
int ans0[N],ans1[N];
int cnt0,cnt1;
signed main()
{
scanf("%lld",&T);
while (T--)
{
cnt0=cnt1=0;
scanf("%lld",&n);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
bool flag=false;
for (int i=1;i<=n;i++)
{
if (a[i]%2==0) ans0[++cnt0]=i;
else ans1[++cnt1]=i;
if (cnt1>=1&&cnt0>=2)
{
printf("YES\n%lld %lld %lld\n",ans0[1],ans0[2],ans1[1]);
flag=true; break;
}
if (cnt1>=3)
{
printf("YES\n%lld %lld %lld\n",ans1[1],ans1[2],ans1[3]);
flag=true; break;
}
}
if (!flag) printf("NO\n");
}
return 0;
}
Ehhh Ah
B.GCD Partition
题目大意:
共
解题思路:
有一个结论:
然后就会发现,我们只需要把序列分成两段,就一定能找到答案。
所以用一个前缀和数组+枚举断点就行。
贴
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int T;
int n,a[N];
int sum[N];
int ans=1;
int gcd(int x,int y)
{
if (!y) return x;
return gcd(y,x%y);;
}
signed main()
{
scanf("%lld",&T);
while (T--)
{
ans=1;
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for (int i=1;i<n;i++) ans=max(ans,gcd(sum[i],sum[n]-sum[i]));
printf("%lld\n",ans);
}
return 0;
}
Ehhh Ah
D. Bit Guessing Game
题目大意:
史交互
共
每组测试会有一个数
- x
修改操作,每次该操作会使得 ,并给出修改后的 。注意,不能使! x
此时你输出的 应满足
每次修改操作最多出现30次。
解题思路:
我讨厌交互题一辈子
考虑在二进制下从低位向高位减。若减去后,
若某一位原本是
注意特判最高位。若最高位-1后只剩下一个1,应直接加上答案然后跳出去,不然会出现负数。
我宣布这就是史
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int pre,cnt,l,l2;
int ans;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while (T--)
{
ans=l=l2=0;
cin>>pre;
for (int i=0;i<=30&⪯i++)
{
cout<<"- "<<(1<<i)+l<<"\n";
cout.flush();
cin>>cnt;
ans+=(1<<i)+l;
if (cnt==pre-1-l2) l=l2=0;
else
{
if (cnt==1) { ans+=(1<<i); break; }
else l=1<<i,l2=1;
}
pre=cnt;
}
cout<<"! "<<ans<<"\n";
cout.flush();
}
return 0;
}
Ehhh Ah
E.Josuke and Complete Graph
题目大意:
共
解题思路:
前置知识:整除分块,我不会。
转化题意,这题就是求
可以整除分块做。
同时,需要特判
不做评价
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int l,r;
int ans;
signed main()
{
scanf("%lld",&T);
while (T--)
{
scanf("%lld%lld",&l,&r);
l--,ans=max(1ll*0,r/2-l);
for (int i=1,j=0;i<=l;i=j+1)
{
j=l/(l/i);
int k=min(j,r/(l/i+2));
if (k>=i) ans+=k-i+1;
}
printf("%lld\n",ans);
}
return 0;
}
Ehhh Ah
F.Three Chairs
题目大意:
给出一个数组
解题思路:
前置知识:莫比乌斯反演,我不会。
感觉今天不会会了,贴个莫比乌斯反演学习链接,以后找时间继续学。
贴个其他大佬的题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】