CF948

A

方法

只需要n==m或者(n-m)%2==0即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
int m; cin>>m;
if(n>m && (n-m)%2==0 || n==m)
{
cout<<"YES\n";
}
else cout<<"No\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}

B

方法

先获得原来的二进制数,然后对连续都是1的两位,构造成-1,0,1即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

void solve()
{
int x; cin>>x;
if(x==1)
{
cout<<1<<"\n1\n";
return;
}
auto qpower=[&](int a,int n)
{
int ans=1;
while(n)
{
if(n&1) ans=ans*a;
a=a*a;
n>>=1;
}
return ans;
};
std::vector<int> v(33,0);
for (int i = 0; (1<<i)<=x; ++i)
{
v[i]=((x&(1<<i))!=0?1:0);
}
// 7
// 1
// 1
// 1
// 14
// 0 1 1 1
// 24
// 0 0 0 1 1
// 15
// 1 1 1 1
// 27
// 1 1 0 1 1
// 11
// 1 1 0 1
// 19
// 1 1 0 0 1
// for(auto t: v) cout<<t<<" ";
// cout<<"\n";
int temp=0;
int j=-1;
for (int i = 0; i < 33; ++i)
{
if(i==j)
{
if(v[i]==1)
{
v[i]=0;
temp*=2;
j++;
}
else v[i]=1,temp=0;
}
if(v[i]==1 && v[i+1]==1)
{
temp=qpower(2,i+2);
v[i]=-1;
v[i+1]=0;
j=i+2;
}
}
cout<<32<<"\n";
for (int i = 0; i < 32; ++i)
{
cout<<v[i]<<" ";
}
cout<<"\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

void solve()
{
int x; cin>>x;
if(x==1)
{
cout<<1<<"\n1\n";
return;
}
std::vector<int> v(33,0);
for (int i = 0; (1<<i)<=x; ++i)
{
v[i]=((x&(1<<i))!=0?1:0);
}
for (int i = 0; i < 33; ++i)
{
if(v[i]==2)
{
v[i]=0;
v[i+1]++;
}
if(v[i] && v[i+1])
{
v[i]=-1;
v[i+1]=0;
v[i+2]++;
}
}
cout<<32<<"\n";
for(int i=0;i<32;i++)
{
cout<<v[i]<<" ";
}
cout<<"\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}

C

方法

考虑从小到大排序,如果$ lcm⁡(a_1,a_2…a_n)≠a_n\(那么结果就是\)n$。

考虑一种算答案方式,比如找一个数列中未出现的\(X\)使得$ lcm⁡(a_{p1},a_{p2}…a_{pm})=X\(且\)m$最大。

但是我们难以做到让最小公倍数是\(X\),因此我们考虑改写成找一个\(X\)使得数列内是\(X\)的因数的数的最小公倍数没有在数列中出现,要使\(X\)在数列内的因数的个数最多。

考虑数列的最小公倍数是$ a_n\(因此我们只需要计算\)X|a_n\(的\)X$即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
std::vector<int> a(n,0);
std::map<int, int> map;
for (int i = 0; i < n; ++i)
{
cin>>a[i];
map[a[i]]++;
}
sort(begin(a),end(a));
bool flag=false;
for (int i = 0; i < n; ++i)
{
if(a[n-1]%a[i]!=0) flag=true;
}
if(flag==true)
{
cout<<n<<"\n";
return;
}
int ans=0;
auto update=[&](int x)
{
int len=0;
int num=1;
for (int i = 0; i < n; ++i)
{
if(x%a[i]==0)
{
len++;
num=lcm(num,a[i]);
}
}
if(map[num]) return;
ans=max(ans,len);
};
for (int i = 1; i*i < a[n-1]; ++i)
{
if(a[n-1]%i==0)
{
update(i);
update(a[n-1]/i);
}
}
cout<<ans<<"\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}