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); }
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; }
|