結果
問題 | No.1463 Hungry Kanten |
ユーザー | KKT89 |
提出日時 | 2022-02-20 20:22:57 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 8,085 bytes |
コンパイル時間 | 2,835 ms |
コンパイル使用メモリ | 165,912 KB |
実行使用メモリ | 55,296 KB |
最終ジャッジ日時 | 2024-06-29 10:57:12 |
合計ジャッジ時間 | 5,715 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | AC | 22 ms
5,376 KB |
testcase_03 | AC | 404 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 716 ms
55,296 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 3 ms
5,376 KB |
testcase_11 | AC | 3 ms
5,376 KB |
testcase_12 | AC | 3 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 7 ms
5,376 KB |
testcase_15 | AC | 3 ms
5,376 KB |
testcase_16 | AC | 23 ms
5,760 KB |
testcase_17 | WA | - |
testcase_18 | AC | 23 ms
5,376 KB |
testcase_19 | AC | 354 ms
26,496 KB |
testcase_20 | AC | 512 ms
33,664 KB |
testcase_21 | WA | - |
ソースコード
#pragma GCC optimize("Ofast") #include <iostream> #include <vector> #include <algorithm> #include <map> #include <queue> #include <cstdio> #include <ctime> #include <assert.h> #include <chrono> #include <random> #include <numeric> #include <set> #include <deque> #include <stack> #include <sstream> #include <utility> #include <cstring> #include <unordered_map> #include <unordered_set> #include <tuple> #include <array> #include <bitset> using namespace std; typedef long long int ll; typedef unsigned long long ull; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); ll myRand(ll B) { return (ull)rng() % B; } inline double time() { return static_cast<double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9; } // このライブラリ割り算バグってます // 参考: // https://awakia-n.hatenablog.com/entry/20100515/1273922367 // 今後参考にしたい: // https://drive.google.com/file/d/15_gwYirAxwjbTMEq5MXaPEZAlzkbZfia/view struct BigInt{ vector<int> d; bool minus = false; BigInt& normalize(){ int i = (int)d.size() - 1; while(i>=0 and d[i] == 0)--i; d.resize(i+1); if((int)d.size() == 0) { d.emplace_back(0); minus = false; } return *this; } int size(){ return d.size(); } BigInt(ll _x = 0){ if(_x < 0){ minus = true; _x = -_x; } while(_x){ d.emplace_back(_x%10); _x /= 10; } if(d.size() == 0){ d.emplace_back(0); } } BigInt(string _x){ for(char &c:_x){ if(c == '-'){ minus = true; } else{ d.emplace_back(c-'0'); } } reverse(d.begin(), d.end()); normalize(); } BigInt& operator = (const BigInt& x); BigInt& operator = (const ll& x); BigInt& operator = (const string& x); const bool operator < (const BigInt& x) const; const bool operator > (const BigInt& x) const; const bool operator <= (const BigInt& x) const; const bool operator >= (const BigInt& x) const; const bool operator != (const BigInt& x) const; const bool operator == (const BigInt& x) const; BigInt operator -() const; BigInt& operator += (const BigInt& x); BigInt& operator -= (const BigInt& x); BigInt& operator *= (const BigInt& x); BigInt& operator /= (const BigInt& x); BigInt& operator %= (const BigInt& x); const BigInt operator + (const BigInt& x) const; const BigInt operator - (const BigInt& x) const; const BigInt operator * (const BigInt& x) const; const BigInt operator / (const BigInt& x) const; const BigInt operator % (const BigInt& x) const; friend pair<BigInt, BigInt> divmod (const BigInt& lhs, const BigInt& rhs); friend istream& operator >> (istream& is, BigInt& x); friend ostream& operator << (ostream& os, const BigInt& x); friend const BigInt abs(BigInt x); }; BigInt& BigInt::operator = (const BigInt& x){ minus = x.minus; d = x.d; return *this; } BigInt& BigInt::operator = (const ll& x){ return *this = BigInt(x); } BigInt& BigInt::operator = (const string& x){ return *this = BigInt(x); } const bool BigInt::operator < (const BigInt& x) const{ if(minus != x.minus) return (minus ? true : false); if(d.size() != x.d.size()) return (d.size() < x.d.size()) ^ minus; for (int i = (int)d.size()-1; i >= 0; --i){ if(d[i] != x.d[i]) return (d[i] < x.d[i]) ^ minus; } return false; } const bool BigInt::operator > (const BigInt& x) const{return x<(*this);} const bool BigInt::operator <= (const BigInt& x) const{return !(x<(*this));} const bool BigInt::operator >= (const BigInt& x) const{return !(x>(*this));} const bool BigInt::operator != (const BigInt& x) const{return (*this)<x || x<(*this);} const bool BigInt::operator == (const BigInt& x) const{return !((*this)<x || x<(*this));} BigInt BigInt::operator -() const{ BigInt res(*this); res.minus = !res.minus; return res; } BigInt& BigInt::operator += (const BigInt& x){ if(minus != x.minus) return *this -= -x; if(d.size() < x.d.size()) d.resize(x.d.size()); int tmp = 0; for (int i = 0; i < (int)d.size(); ++i) { d[i] += (i < (int)x.d.size() ? x.d[i] : 0) + tmp; if(d[i] >= 10){ tmp = 1; d[i] -= 10; } else tmp = 0; } if(tmp) d.emplace_back(1); return *this; } BigInt& BigInt::operator -= (const BigInt& x){ if(minus != x.minus) return *this += -x; vector<int> dd(x.d); if(((*this)<x) ^ minus){ swap(d,dd); minus = !minus; } int tmp = 0; for (int i = 0; i < (int)d.size(); ++i) { d[i] -= (i < (int)dd.size() ? dd[i] : 0) + tmp; if(d[i] < 0){ d[i] += 10; tmp = 1; } else{ tmp = 0; } } return this->normalize(); } BigInt& BigInt::operator *= (const BigInt& x){ minus ^= x.minus; int N1 = (int)d.size(); int N2 = (int)x.d.size(); int N = N1 + N2; vector<int> dd(N); for (int i = 0; i < N1; ++i) { for (int j = 0; j < N2; ++j) { dd[i+j] += d[i] * x.d[j]; } } for (int i = 0; i+1 < N; ++i) { dd[i+1] += dd[i] / 10; dd[i] %= 10; } swap(d,dd); return this->normalize(); } BigInt& BigInt::operator /= (const BigInt& x){ return *this = divmod(*this, x).first; } BigInt& BigInt::operator %= (const BigInt& x){ return *this = divmod(*this, x).second; } const BigInt BigInt::operator + (const BigInt& x) const{ BigInt res(*this); return res += x; } const BigInt BigInt::operator - (const BigInt& x) const{ BigInt res(*this); return res -= x; } const BigInt BigInt::operator * (const BigInt& x) const{ BigInt res(*this); return res *= x; } const BigInt BigInt::operator / (const BigInt& x) const{ BigInt res(*this); return res /= x; } const BigInt BigInt::operator % (const BigInt& x) const{ BigInt res(*this); return res %= x; } pair<BigInt, BigInt> divmod (const BigInt& lhs, const BigInt& rhs){ if((int)rhs.d.size() == 1 and rhs.d[0] == 0){ cerr << "error: division by zero" << endl; exit(1); } if(lhs < rhs){ return make_pair(BigInt(0), lhs); } BigInt base,q,r; int N = (int)lhs.d.size() - (int)rhs.d.size() + 1; base.d.resize(N); base.d.back() = 1; q.d.resize(N); r = lhs; for (int i = N-1; i >= 0; --i) { int L = 0, R = 10; while(R-L > 1){ int mid = (L+R)/2; if(BigInt(mid)*rhs*base <= r){ L = mid; } else{ R = mid; } } q.d[i] = L; r -= BigInt(L)*rhs*base; base.d.pop_back(); if(base.d.size()) base.d.back() = 1; } return make_pair(q.normalize(), r.normalize()); } istream& operator >> (istream& is, BigInt& x){ string s; is >> s; x = BigInt(s); return is; } ostream& operator << (ostream& os, const BigInt& x){ if(x.minus) os << '-'; int N = x.d.size(); for (int i = N-1; i >= 0; --i){ os << x.d[i]; } return os; } const BigInt abs(BigInt x){ x.minus = false; return x; } int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n,k; cin >> n >> k; vector<BigInt> a(n); set<BigInt> st; for(int i=0;i<n;i++){ ll x; cin >> x; a[i] = BigInt(x); } for(int i=0;i<(1<<n);i++){ if(__builtin_popcount(i) < k)continue; BigInt r = 1; for(int j=0;j<n;j++){ if((1<<j)&i) r *= a[j]; } st.insert(r); } for(int i=0;i<(1<<n);i++){ if(__builtin_popcount(i) < k)continue; BigInt r = 1; for(int j=0;j<n;j++){ if((1<<j)&i) r += a[j]; } st.insert(r); } cout << st.size() << endl; }