A
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
void solve()
{
int n,m;cin>>n>>m;
if(n&1){
if((m&1)&&m>=1&&m<=n)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}else{
if((m%2==0)&&m>=0&&m<=n)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
B
题目概述
给定正整数 x x x,构造满足以下条件的数列
思路
如果没有"相邻两个元素不同时为非零数",就变成了写出 x x x的二进制表示
而二进制表示与最终的答案相差在哪?在于二进制表示有连续的 1 1 1上,我们想要用什么代替连续的 1 1 1
经过写几个例子发现,几个连续的二进制 1 1 1可以转换为首位的 − 1 -1 −1和末位置 + 1 +1 +1的 1 1 1,如图
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
void solve()
{
int x;cin>>x;
vector<int>a(35,0);
for(int i=0;i<32;i++){
a[i]=x>>i&1;//位移运算存储二进制表示
}
for(int i=0;i+1<32;i++){
if(a[i]==1&&a[i+1]==1){
int j=i;
while(a[j]==1&&a[j+1]==1)j++;
a[i]=-1;
a[j+1]=1;
for(int k=i+1;k<=j;k++)a[k]=0;
i=j;
}
}
cout<<32<<'\n';
for(int i=0;i<32;i++)cout<<a[i]<<' ';
cout<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
C
题目大意
给定 n n n个正整数的数组 a a a,定义特殊子序列为该子序列的最小公倍数不在 a a a内,问 a a a的最长特殊子序列的长度
思路
如果最大元素 m a ma ma不能整除其他元素,则为 n n n
否则,最长的 l c m lcm lcm一定是 m a ma ma的约数,遍历约数筛最大即可
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
void solve()
{
int n;cin>>n;
vector<int>a(n+1);
int ma=-1;
for(int i=1;i<=n;i++)cin>>a[i],ma=max(ma,a[i]);
for(int i=1;i<=n;i++){
if(ma%a[i]){
cout<<n<<'\n';
return;
}
}
//最长lcm必为ma约数
int ans=0;
auto check=[&](int x){
for(int i=1;i<=n;i++)if(a[i]==x)return;
int t,cnt;
cnt=0;
t=1;
for(int i=1;i<=n;i++){
if(x%a[i]==0){
cnt++;
t=lcm(t,a[i]);
}
}
if(t==x)ans=max(ans,cnt);
};
for(int i=1;i*i<=ma;i++){
if(ma%i==0){
check(i);
check(ma/i);
}
}
cout<<ans<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}