結果
| 問題 |
No.103 素因数ゲーム リターンズ
|
| コンテスト | |
| ユーザー |
nrvft
|
| 提出日時 | 2021-02-12 04:57:10 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 20 ms / 5,000 ms |
| コード長 | 3,636 bytes |
| コンパイル時間 | 3,019 ms |
| コンパイル使用メモリ | 206,296 KB |
| 最終ジャッジ日時 | 2025-01-18 17:45:51 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 20 |
コンパイルメッセージ
main.cpp: In constructor ‘constexpr eratosthenes_sieve::eratosthenes_sieve()’:
main.cpp:42:13: warning: call to non-‘constexpr’ function ‘void std::iota(_ForwardIterator, _ForwardIterator, _Tp) [with _ForwardIterator = int*; _Tp = int]’ [-Winvalid-constexpr]
42 | iota(Primes, Primes + PSIZE, 0);
| ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/13/numeric:62,
from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:58,
from main.cpp:1:
/usr/include/c++/13/bits/stl_numeric.h:88:5: note: ‘void std::iota(_ForwardIterator, _ForwardIterator, _Tp) [with _ForwardIterator = int*; _Tp = int]’ declared here
88 | iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
| ^~~~
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using vl = vector<ll>;
template<class T> using vc = vector<T>;
template<class T> using vvc = vector<vector<T>>;
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define repr(i, n) for (ll i = (n)-1; i >= 0; i--)
#define repe(i, l, r) for (ll i = (l); i < (r); i++)
#define reper(i, l, r) for (ll i = (r)-1; i >= (l); i--)
#define repa(i,n) for (auto& i: n)
template<class T1, class T2> inline bool chmax(T1 &a, const T2 &b) {if (a<b) { a=b; return 1;} return 0;}
template<class T1, class T2> inline bool chmin(T1 &a, const T2 &b) {if (b<a) { a=b; return 1;} return 0;}
struct init{init(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);}}init_;
#ifdef DEBUG
template <class T> void verr(const set<T> &st) { repa(a, st) cerr << a << " "; cerr << endl; }
template <class S, class T> void verr(const map<S, T> &mp) { repa(a, mp) cerr << "{" << a.first << ", " << a.second << "} "; cerr << endl; }
template <class S, class T, class N> void verr(const vector<pair<S,T>>& a, const N& n) { rep(i, n) cerr << "{" << a[i].first << ", " << a[i].second << "} "; cerr << endl; }
template <class T, class N> void verr(const vector<T>& a, const N& n) { rep(i, n) cerr << a[i] << " "; cerr << endl; }
ll dbgt = 1; void err() { cerr << "passed " << dbgt++ << endl; }
template<class H, class... T> void err(H&& h,T&&... t){ cerr<< h << (sizeof...(t)?" ":"\n") << flush; if(sizeof...(t)>0) err(forward<T>(t)...); }
#endif
const ll INF = 4e18;
const ld EPS = 1e-11;
const ld PI = acos(-1.0L);
const ll MOD = 1e9 + 7;
// const ll MOD = 998244353;
//--------------------------------------------------------------------------------//
// 1~1e5までの値について素数:自身の値, 合成数:最小の素因数 の配列を返す
constexpr int PSIZE = 1e6 + 1;
struct eratosthenes_sieve{
int Primes[PSIZE];
bool isPrime[PSIZE];
constexpr eratosthenes_sieve(): Primes(), isPrime(){
iota(Primes, Primes + PSIZE, 0);
fill(isPrime, isPrime + PSIZE, 0);
for (int i = 2; i < PSIZE; i++){
if (Primes[i] != i) continue;
for (int s = i * 2; s < PSIZE; s += i){
Primes[s] = i;
}
isPrime[i] = true;
}
}
// 数値vの素因数の配列を昇順で取得
vector<int> get_pfactor(int v){
vector<int> res;
int p = Primes[v];
while(v > 1){
while (Primes[v] == p) v /= Primes[v];
res.emplace_back(p);
p = Primes[v];
}
reverse(res.begin(), res.end());
return res;
}
// 数値vの素因数分解を取得
map<int, int> get_factrization(int v){
map<int, int> mp;
while(v>1){
mp[Primes[v]]++;
v /= Primes[v];
}
return mp;
}
};
using ES = struct eratosthenes_sieve;
// ES es;
int main() {
ll N;
cin >> N;
vl X(N);
rep(i, N) cin >> X[i];
ES es;
vl gr(10001, -1);
gr[1] = 0;
repe(x, 2, 10001){
auto vs = es.get_pfactor(x);
ll n = vs.size();
set<ll> st;
rep(i, n) {
ll d = x / vs[i];
st.emplace(gr[d]);
if (d % vs[i] == 0) st.emplace(gr[d / vs[i]]);
ll now = 0;
for(auto v: st){
if (v > now) break;
now++;
}
gr[x] = now;
}
}
ll ans = 0;
rep(i, N) ans ^= gr[X[i]];
cout << (ans == 0 ? "Bob" : "Alice") << endl;
}
nrvft