結果
問題 | No.2136 Dice Calendar? |
ユーザー | kaichou243 |
提出日時 | 2022-10-21 23:47:58 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 847 ms / 5,000 ms |
コード長 | 11,264 bytes |
コンパイル時間 | 3,210 ms |
コンパイル使用メモリ | 302,840 KB |
実行使用メモリ | 150,652 KB |
最終ジャッジ日時 | 2024-07-01 07:53:19 |
合計ジャッジ時間 | 8,869 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 21 ms
68,992 KB |
testcase_01 | AC | 21 ms
68,952 KB |
testcase_02 | AC | 24 ms
69,184 KB |
testcase_03 | AC | 21 ms
68,984 KB |
testcase_04 | AC | 19 ms
69,040 KB |
testcase_05 | AC | 21 ms
68,968 KB |
testcase_06 | AC | 21 ms
69,064 KB |
testcase_07 | AC | 20 ms
69,148 KB |
testcase_08 | AC | 22 ms
69,124 KB |
testcase_09 | AC | 23 ms
69,108 KB |
testcase_10 | AC | 25 ms
69,328 KB |
testcase_11 | AC | 34 ms
70,508 KB |
testcase_12 | AC | 37 ms
71,040 KB |
testcase_13 | AC | 33 ms
70,336 KB |
testcase_14 | AC | 45 ms
71,852 KB |
testcase_15 | AC | 112 ms
80,736 KB |
testcase_16 | AC | 137 ms
83,760 KB |
testcase_17 | AC | 104 ms
78,744 KB |
testcase_18 | AC | 287 ms
102,296 KB |
testcase_19 | AC | 380 ms
107,864 KB |
testcase_20 | AC | 446 ms
117,364 KB |
testcase_21 | AC | 594 ms
125,792 KB |
testcase_22 | AC | 660 ms
139,316 KB |
testcase_23 | AC | 847 ms
150,652 KB |
testcase_24 | AC | 20 ms
69,040 KB |
testcase_25 | AC | 35 ms
70,368 KB |
testcase_26 | AC | 770 ms
143,448 KB |
ソースコード
#include<bits/stdc++.h> #include <immintrin.h> #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define FOR(i,n) for(int i = 0; i < (n); i++) #define sz(c) ((int)(c).size()) #define ten(x) ((int)1e##x) #define all(v) (v).begin(), (v).end() using namespace std; using ll=long long; using P = pair<ll,ll>; const long double PI=acos(-1); const ll INF=1e18; const int inf=1e9; //fast Input by yosupo #include <unistd.h> #include <algorithm> #include <array> #include <cassert> #include <cctype> #include <cstring> #include <sstream> #include <string> #include <type_traits> #include <vector> namespace fastio{ /* quote from yosupo's submission in Library Checker */ int bsr(unsigned int n) { return 8 * (int)sizeof(unsigned int) - 1 - __builtin_clz(n); } // @param n `1 <= n` // @return maximum non-negative `x` s.t. `(n & (1 << x)) != 0` int bsr(unsigned long n) { return 8 * (int)sizeof(unsigned long) - 1 - __builtin_clzl(n); } // @param n `1 <= n` // @return maximum non-negative `x` s.t. `(n & (1 << x)) != 0` int bsr(unsigned long long n) { return 8 * (int)sizeof(unsigned long long) - 1 - __builtin_clzll(n); } // @param n `1 <= n` // @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0` int bsr(unsigned __int128 n) { unsigned long long low = (unsigned long long)(n); unsigned long long high = (unsigned long long)(n >> 64); return high ? 127 - __builtin_clzll(high) : 63 - __builtin_ctzll(low); } namespace internal { template <class T> using is_signed_int128 = typename std::conditional<std::is_same<T, __int128_t>::value || std::is_same<T, __int128>::value, std::true_type, std::false_type>::type; template <class T> using is_unsigned_int128 = typename std::conditional<std::is_same<T, __uint128_t>::value || std::is_same<T, unsigned __int128>::value, std::true_type, std::false_type>::type; template <class T> using make_unsigned_int128 = typename std::conditional<std::is_same<T, __int128_t>::value, __uint128_t, unsigned __int128>; template <class T> using is_integral = typename std::conditional<std::is_integral<T>::value || internal::is_signed_int128<T>::value || internal::is_unsigned_int128<T>::value, std::true_type, std::false_type>::type; template <class T> using is_signed_int = typename std::conditional<(is_integral<T>::value && std::is_signed<T>::value) || is_signed_int128<T>::value, std::true_type, std::false_type>::type; template <class T> using is_unsigned_int = typename std::conditional<(is_integral<T>::value && std::is_unsigned<T>::value) || is_unsigned_int128<T>::value, std::true_type, std::false_type>::type; template <class T> using to_unsigned = typename std::conditional< is_signed_int128<T>::value, make_unsigned_int128<T>, typename std::conditional<std::is_signed<T>::value, std::make_unsigned<T>, std::common_type<T>>::type>::type; template <class T> using is_integral_t = std::enable_if_t<is_integral<T>::value>; template <class T> using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>; template <class T> using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>; template <class T> using to_unsigned_t = typename to_unsigned<T>::type; } // namespace internal struct Scanner { public: Scanner(const Scanner&) = delete; Scanner& operator=(const Scanner&) = delete; Scanner(FILE* fp) : fd(fileno(fp)) {} void read() {} template <class H, class... T> void read(H& h, T&... t) { bool f = read_single(h); assert(f); read(t...); } int read_unsafe() { return 0; } template <class H, class... T> int read_unsafe(H& h, T&... t) { bool f = read_single(h); if (!f) return 0; return 1 + read_unsafe(t...); } int close() { return ::close(fd); } private: static constexpr int SIZE = 1 << 15; int fd = -1; std::array<char, SIZE + 1> line; int st = 0, ed = 0; bool eof = false; bool read_single(std::string& ref) { if (!skip_space()) return false; ref = ""; while (true) { char c = top(); if (c <= ' ') break; ref += c; st++; } return true; } bool read_single(double& ref) { std::string s; if (!read_single(s)) return false; ref = std::stod(s); return true; } template <class T, std::enable_if_t<std::is_same<T, char>::value>* = nullptr> bool read_single(T& ref) { if (!skip_space<50>()) return false; ref = top(); st++; return true; } template <class T, internal::is_signed_int_t<T>* = nullptr, std::enable_if_t<!std::is_same<T, char>::value>* = nullptr> bool read_single(T& sref) { using U = internal::to_unsigned_t<T>; if (!skip_space<50>()) return false; bool neg = false; if (line[st] == '-') { neg = true; st++; } U ref = 0; do { ref = 10 * ref + (line[st++] & 0x0f); } while (line[st] >= '0'); sref = neg ? -ref : ref; return true; } template <class U, internal::is_unsigned_int_t<U>* = nullptr, std::enable_if_t<!std::is_same<U, char>::value>* = nullptr> bool read_single(U& ref) { if (!skip_space<50>()) return false; ref = 0; do { ref = 10 * ref + (line[st++] & 0x0f); } while (line[st] >= '0'); return true; } bool reread() { if (ed - st >= 50) return true; if (st > SIZE / 2) { std::memmove(line.data(), line.data() + st, ed - st); ed -= st; st = 0; } if (eof) return false; auto u = ::read(fd, line.data() + ed, SIZE - ed); if (u == 0) { eof = true; line[ed] = '\0'; u = 1; } ed += int(u); line[ed] = char(127); return true; } char top() { if (st == ed) { bool f = reread(); assert(f); } return line[st]; } template <int TOKEN_LEN = 0> bool skip_space() { while (true) { while (line[st] <= ' ') st++; if (ed - st > TOKEN_LEN) return true; if (st > ed) st = ed; for (auto i = st; i < ed; i++) { if (line[i] <= ' ') return true; } if (!reread()) return false; } } }; //fast Output by ei1333 /** * @brief Printer(高速出力) */ struct Printer { public: explicit Printer(FILE *fp) : fp(fp) {} ~Printer() { flush(); } template< bool f = false, typename T, typename... E > void write(const T &t, const E &... e) { if(f) write_single(' '); write_single(t); write< true >(e...); } template< typename... T > void writeln(const T &...t) { write(t...); write_single('\n'); } void flush() { fwrite(line, 1, st - line, fp); st = line; } private: FILE *fp = nullptr; static constexpr size_t line_size = 1 << 16; static constexpr size_t int_digits = 20; char line[line_size + 1] = {}; char small[32] = {}; char *st = line; template< bool f = false > void write() {} void write_single(const char &t) { if(st + 1 >= line + line_size) flush(); *st++ = t; } template< typename T, enable_if_t< is_integral< T >::value, int > = 0 > void write_single(T s) { if(st + int_digits >= line + line_size) flush(); if(s == 0) { write_single('0'); return; } if(s < 0) { write_single('-'); s = -s; } char *mp = small + sizeof(small); typename make_unsigned< T >::type y = s; size_t len = 0; while(y > 0) { *--mp = y % 10 + '0'; y /= 10; ++len; } memmove(st, mp, len); st += len; } void write_single(const string &s) { for(auto &c : s) write_single(c); } void write_single(const char *s) { while(*s != 0) write_single(*s++); } template< typename T > void write_single(const vector< T > &s) { for(size_t i = 0; i < s.size(); i++) { if(i) write_single(' '); write_single(s[i]); } } }; }; //namespace fastio ll fact[21]; struct ms{ int mulset; ll part; ms(){ mulset=511; part=9043225708576ll; } ms(int mulset_,ll part_) : mulset(mulset_), part(part_){} int getpart(int ind){ if(ind==-1) return -1; return part>>(5*ind)&(31); } ll count(){ ll ret=fact[getpart(8)-8]; for(int i=0;i<9;i++) ret/=fact[getpart(i)-getpart(i-1)-1]; return ret; } }; int main(){ fastio::Scanner sc(stdin); fastio::Printer pr(stdout); #define in(...) sc.read(__VA_ARGS__) #define LL(...) ll __VA_ARGS__;in(__VA_ARGS__) #define INT(...) int __VA_ARGS__;in(__VA_ARGS__) #define STR(...) string __VA_ARGS__;in(__VA_ARGS__) #define out(...) pr.write(__VA_ARGS__) #define outln(...) pr.writeln(__VA_ARGS__) #define outspace(...) pr.write(__VA_ARGS__);pr.write(' ') #define rall(v) (v).rbegin(), (v).rend() /* 与えられたdiceを用いて実現可能な多重集合を全列挙して数え上げる. dpみたいして全部列挙する.多重集合を仕切りを入れて考えてbit列にする.bit数が少ないのでこれをint型で表す また,仕切りの位置を持っておくと嬉しくなれて,仕切りの位置を考えるとき29まで良いことから5bitの数字を9個持てばよくて, これを連結してlong long型にする */ INT(n); fact[0]=1; for(int i=1;i<=20;i++) fact[i]=fact[i-1]*i; vector<ms> dp(1,ms()),ndp; ndp.reserve(3200000); bitset<1<<29> st(0); int S[6]; for(int i=0;i<n;i++){ for(int j=0;j<6;j++) in(S[j]),--S[j]; for(auto& v : dp){ for(int j=0;j<6;j++){ int mask=(1<<v.getpart(S[j]))-1; int nms=(v.mulset&~mask)<<1|(v.mulset&mask); if(st[nms]) continue; st.set(nms); ll np=v.part+(1134979744801ll&~((1ll<<(5*S[j]))-1)); ndp.push_back(ms(nms,np)); } } swap(dp,ndp); ndp.clear(); ndp.reserve(3200000); } ll ans=0; for(auto& tmp : dp){ ans=(ans+tmp.count())%998244353; } outln(ans); }