Автор проблеми: | Хасан Салех (MathModel) |
Підготовлено: | Хасан Салех (MathModel) |
Редаговано: | Хасан Салех (MathModel) |
Рішення 1
Зверніть увагу, що є лише два випадки парності суми масиву, розглянемо, коли непарне, розглянемо всі можливі вибори для суми пари :
і, отже, комплементарне .
і, отже, комплементарне .
і, отже, комплементарне
Зверніть увагу, що в усіх конфігураціях жодна з них не відповідає парності, отже, відповідь дорівнює , коли (\sum a \bmod 2=1).
Тепер розглянемо, коли парне, ми маємо всі можливі конфігурації :
і, отже, комплементарне .
і, отже, комплементарне .
і, отже, комплементарне
Зверніть увагу, що всі конфігурації відповідають, отже, ми розглядаємо всі пари, які є
Складність .
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
int n;cin>>n;
vector<int>a(n);
ll sum=0;
for(auto &i:a){
cin>>i;
sum+=i;
}
if(sum&1){
cout<<"0\n";
}else{
cout<<(ll)(n*(n-1))/2<<"\n";
}
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
return 0;
}Рішення 2
Ми можемо послідовно парувати кожну парність з відповідною і накопичувати кількість кожного разу, кожного разу ми будемо парувати парні з непарними і просто накопичувати кількість. Це працює лише тоді, коли парне, в іншому випадку це 0.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solve(){
int n;cin>>n;
vector<int>a(n);
int o=0;int e=0;
ll sum=0;
ll ans=0;
for(auto i:a){
cin>>i;
sum+=i;
}
if(sum&1){
cout<<"0\n";
return;
}else{
for(auto i:a){
ans+=e+o;
if(i&1){
e++;
}else{
o++;
}
}
}
cout<<ans<<"\n";
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
return 0;
}Складність .