让a>b对于能构成的要不都是偶数要不一个是偶数但除以二不等于另一个
求出能构造出的矩阵,判断与之前是否相等
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int,int>pii;
#define N 310000
const int mod=1e9+7;
int a[N];
void solve(){
int a,b;
cin>>a>>b;
if(a==1&&b==1) cout<<"NO"<<endl;
else if(a%2==0&&b%2==0) cout<<"YES"<<endl;
else if((a%2==0&&a!=b*2)||(b%2==0&&a*2!=b)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
B:Equalize
贪心,先排序,去重,发现能相等的值在一个滑动窗口,只要求出大于a[i]+n位置然后进行求出两者之间的数目即可
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int,int>pii;
#define N 310000
const int mod=1e9+7;
int a[N];
void solve(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int res=0;
sort(a,a+n);
int m=unique(a,a+n)-a;
for(int i=0;i<m;i++){
int g=lower_bound(a,a+m,a[i]+n)-a;
res=max(g-i,res);
}
cout<<res<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}
这道题先用数学来分析
如果是在前半段的话 (2*k-2)*m=n-x 满足大于x
那么k必须是n-x因子
如果在后半段的话 (2*k-2)*m=n-x+2满足大于x
防止有重复的用set去重
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int,int>pii;
#define N 310000
const int mod=1e9+7;
void solve(){
int n,x;
cin>>n>>x;
set<int>s;
int g=n-x;
for(int i=1;i<=g/i;i++){
if(g%i==0){
int a=(i+2)/2,b=(g/i+2)/2;
if(i%2==0&&x<=a) s.insert(a);
if(g/i%2==0&&x<=b) s.insert(b);
}
}
g=n+x-2;
for(int i=1;i<=g/i;i++){
if(g%i==0){
int a=(i+2)/2,b=(g/i+2)/2;
if(i%2==0&&x<=a) s.insert(a);
if(g/i%2==0&&x<=b) s.insert(b);
}
}
cout<<s.size()<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}