結果
| 問題 |
No.2672 Subset Xor Sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-03-15 22:09:49 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,577 bytes |
| コンパイル時間 | 1,679 ms |
| コンパイル使用メモリ | 174,452 KB |
| 実行使用メモリ | 323,584 KB |
| 最終ジャッジ日時 | 2024-09-30 01:26:25 |
| 合計ジャッジ時間 | 14,145 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 52 WA * 14 |
ソースコード
#include <bits/stdc++.h>
#include <unordered_map>
#include <stdlib.h>
using namespace std;
#define rep(i, a, n) for(ll i = a; i < n; i++)
#define rrep(i, a, n) for(ll i = a; i >= n; i--)
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
//constexpr ll MOD = 1000000007;
constexpr ll MOD = 998244353;
constexpr int IINF = 1001001001;
constexpr ll INF = 1LL<<60;
template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}
template <ll MOD> class modint {
ll val;
static vector<modint<MOD>> factorial_vec;
public:
ll get() const { return (ll)val; }
// コンストラクタ
modint(ll x = 0){
val = x % MOD;
if(val < 0) x += MOD;
}
// 入出力ストリーム
friend constexpr istream &operator>>(istream &is, modint<MOD> &x){
ll y; is >> y;
x = y;
return is;
}
friend constexpr ostream &operator<<(ostream &os, const modint<MOD> &x){
return os << x.val;
}
// 算術演算子
modint<MOD> operator -(){return modint<MOD>(-val);}
modint<MOD> operator +(const modint<MOD> &r) const { return modint<MOD>(*this) += r; }
modint<MOD> operator -(const modint<MOD> &r) const { return modint<MOD>(*this) -= r; }
modint<MOD> operator *(const modint<MOD> &r) const { return modint<MOD>(*this) *= r; }
modint<MOD> operator /(const modint<MOD> &r) const { return modint<MOD>(*this) /= r; }
// 代入演算子
modint<MOD> &operator +=(const modint<MOD> &r){
val += r.val;
if(val >= MOD) val -= MOD;
return *this;
}
modint<MOD> &operator -=(const modint<MOD> &r){
if(val < r.val) val += MOD;
val -= r.val;
return *this;
}
modint<MOD> &operator *=(const modint<MOD> &r){
val = val*r.val%MOD;
if(val < 0) val += MOD;
return *this;
}
modint<MOD> &operator /=(const modint<MOD> &r){
*this *= inv(r);
return *this;
}
//等価比較演算子
bool operator ==(const modint<MOD>& r){return this -> val == r.val;}
bool operator !=(const modint<MOD>& r){return this -> val != r.val;}
bool operator <(const modint<MOD>& r){return this -> val < r.val;}
bool operator <=(const modint<MOD>& r){return this -> val <= r.val;}
bool operator >(const modint<MOD>& r){return this -> val > r.val;}
bool operator >=(const modint<MOD>& r){return this -> val >= r.val;}
// 累乗
static modint<MOD> modpow(modint<MOD> num, ll exp){
if(!exp) return modint<MOD>(1); // 0乗
modint<MOD> ret(1);
modint<MOD> tmp = num;
while(exp){
if(exp&1) ret *= tmp;
tmp *= tmp;
exp >>= 1;
}
return ret;
}
// 逆元
static modint<MOD> inv(modint<MOD> num){
return modpow(num, MOD-2);
}
// 階乗
static modint<MOD> factorial(ll n){
modint<MOD> ret(1);
if(n == 0) return ret;
if((ll)factorial_vec.size() >= n) return factorial_vec[n-1];
ret = factorial(n-1)*n;
factorial_vec.push_back(ret);
return ret;
}
// コンビネーション
static modint<MOD> combination(ll n, ll r){
return factorial(n) / factorial(r) / factorial(n-r);
}
};
using mint = modint<MOD>;
template <ll MOD> vector<modint<MOD>> modint<MOD>::factorial_vec;
ll gcd(ll a, ll b){
if(a%b == 0){
return b;
}else{
return gcd(b, a%b);
}
}
ll lcm(ll a, ll b){
return a*b / gcd(a, b);
}
ll powMod(ll x, ll n) {
if (n == 0) return 1 % MOD;
ll val = powMod(x, n / 2);
val *= val;
val %= MOD;
if (n % 2 == 1) val *= x;
return val % MOD;
}
int main() {
ll n;cin>>n;
vector<ll> tmp(5001),a;
rep(i,0,n){
ll _;cin>>_;
tmp[_]++;
}
bool flag = false;
rep(i,0,5001){
if(tmp[i]%2!=0){
a.push_back(i);
}
if(tmp[i]>2){
flag = true;
}
}
n = a.size();
if(n==0){
cout << "Yes" << endl;
return 0;
}
vector<vector<ll>> dp(n+1,vector<ll>(8192,0));
dp[0][0] = 1;
rep(i,0,n){
rep(j,0,8192){
dp[i+1][j] += dp[i][j];
chmin(dp[i+1][j],10);
dp[i+1][j^a[i]] += dp[i][j];
chmin(dp[i+1][j^a[i]],10);
}
}
if(dp[n][0]>3){
cout << "Yes" << endl;
}else if(flag && dp[n][0]>1){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
return 0;
}