Overview
SHA1 Hash: | 69a17ebf8a7b9b3809dc64790242941623b7796f |
---|---|
Date: | 2021-07-08 13:01:03 |
User: | kinaba |
Comment: | TCO21 R3 |
Timelines: | family | ancestors | descendants | both | trunk |
Downloads: | Tarball | ZIP archive |
Other Links: | files | file ages | manifest |
Tags And Properties
- branch=trunk inherited from [9165bd3629]
- sym-trunk inherited from [9165bd3629]
Changes
Added SRM/TCO21-3A-U/1A.cpp version [3986dda3f30c06b9]
1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +static const unsigned MODVAL = 1000000007; 23 +struct mint 24 +{ 25 + unsigned val; 26 + mint() :val(0) {} 27 + mint(int x) :val(x%MODVAL) {} 28 + mint(unsigned x) :val(x%MODVAL) {} 29 + mint(LL x) :val(x%MODVAL) {} 30 +}; 31 +mint& operator+=(mint& x, mint y) { return x = x.val + y.val; } 32 +mint& operator-=(mint& x, mint y) { return x = x.val - y.val + MODVAL; } 33 +mint& operator*=(mint& x, mint y) { return x = LL(x.val)*y.val; } 34 +mint operator+(mint x, mint y) { return x += y; } 35 +mint operator-(mint x, mint y) { return x -= y; } 36 +mint operator*(mint x, mint y) { return x *= y; } 37 + 38 +mint POW(mint x, LL e) { mint v = 1; for (; e; x *= x, e >>= 1) if (e & 1) v *= x; return v; } 39 +mint& operator/=(mint& x, mint y) { return x *= POW(y, MODVAL - 2); } 40 +mint operator/(mint x, mint y) { return x /= y; } 41 + 42 +vector<mint> FAC_(1, 1); 43 +mint FAC(LL n) { while (FAC_.size() <= n) FAC_.push_back(FAC_.back()*LL(FAC_.size())); return FAC_[n]; } 44 + 45 +// nCk :: O(log MODVAL) time, O(n) space. 46 +mint C(LL n, LL k) { return k<0 || n<k ? 0 : FAC(n) / (FAC(k) * FAC(n - k)); } 47 + 48 +class AnnoyingPasswords { public: 49 + int count(int U, int L, int D) 50 + { 51 + return (solve(-1,U,L,D) * FAC(26) / FAC(26 - U) * FAC(26) / FAC(26 - L) * FAC(10) / FAC(10 - D)).val; 52 + } 53 + 54 + int solve(int p, int U, int L, int D) { 55 + tuple<int, int, int, int> key(p, U, L, D); 56 + if (memo.count(key)) 57 + return memo[key]; 58 + if (U == 0 && L == 0 && D == 0) 59 + return 1; 60 + mint ans = 0; 61 + if (p != 0 && U != 0) 62 + ans += solve(0, U - 1, L, D); 63 + if (p != 1 && L != 0) 64 + ans += solve(1, U, L - 1, D); 65 + if (p != 2 && D != 0) 66 + ans += solve(2, U, L, D - 1); 67 + return memo[key] = ans.val; 68 + } 69 + 70 + map<tuple<int, int, int, int>, int> memo; 71 +}; 72 + 73 +// BEGIN CUT HERE 74 +#include <ctime> 75 +double start_time; string timer() 76 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 77 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 78 + { os << "{ "; 79 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 80 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 81 +void verify_case(const int& Expected, const int& Received) { 82 + bool ok = (Expected == Received); 83 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 84 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 85 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 86 +#define END verify_case(_, AnnoyingPasswords().count(U, L, D));} 87 +int main(){ 88 + 89 +CASE(0) 90 + int U = 4; 91 + int L = 1; 92 + int D = 1; 93 + int _ = 0; 94 +END 95 +CASE(1) 96 + int U = 5; 97 + int L = 0; 98 + int D = 4; 99 + int _ = 783743727; 100 +END 101 +CASE(2) 102 + int U = 1; 103 + int L = 1; 104 + int D = 1; 105 + int _ = 40560; 106 +END 107 +CASE(3) 108 + int U = 2; 109 + int L = 2; 110 + int D = 3; 111 + int _ = 559599923; 112 +END 113 +CASE(4) 114 + int U = 0; 115 + int L = 0; 116 + int D = 0; 117 + int _ = 1; 118 +END 119 +CASE(5) 120 + int U = 26; 121 + int L = 26; 122 + int D = 10; 123 + int _ = 0; 124 +END 125 +CASE(6) 126 + int U = 0; 127 + int L = 0; 128 + int D = 0; 129 + int _ = 1; 130 +END 131 +} 132 +// END CUT HERE
Added SRM/TCO21-3A-U/1B-U.cpp version [a3c837bff36416d6]
1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +class TellBagsApart { public: 23 + string whichBagIsSmaller(vector <int> records) 24 + { 25 + srand(time(0)); 26 + string ans; 27 + for (int i = 0; i < records.size(); i += 8) 28 + ans += char('0' + solve(vector<int>(records.begin() + i, records.begin() + i + 8))); 29 + return ans; 30 + } 31 + 32 + int solve(vector<int> r) { 33 + // same = 3/7, diff = 4/7 34 + // same = 19/39, diff = 20/39 35 + int a1 = r[0] + r[1] + r[2] + r[3]; 36 + int s1 = r[0] + r[3]; 37 + int d1 = a1 - s1; 38 + int a2 = r[4] + r[5] + r[6] + r[7]; 39 + int s2 = r[4] + r[7]; 40 + int d2 = a2 - s2; 41 + int lhs, rhs; 42 + if (a1 == 0) { 43 + // s2/a2 closer to 19/39 ? 1 : 2 44 + // 125/273 < s2/a2 45 + lhs = 125 * a2; 46 + rhs = s2 * 273; 47 + } 48 + else if (a2 == 0) { 49 + // s1/a1 closer to 3/7 ? 1 : 2 50 + // s1/a1 < 125/273 51 + lhs = s1 * 273; 52 + rhs = 125 * a1; 53 + } 54 + else { 55 + // s1/a1 < s2/a2 ? 1 : 2 56 + lhs = s1 * a2; 57 + rhs = s2 * a1; 58 + } 59 + 60 + if (lhs == rhs) { 61 + return (rand() >> 8) & 1 ? 1 : 2; 62 + } 63 + else { 64 + return lhs < rhs ? 1 : 2; 65 + } 66 + } 67 +}; 68 + 69 +// BEGIN CUT HERE 70 +#include <ctime> 71 +double start_time; string timer() 72 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 73 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 74 + { os << "{ "; 75 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 76 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 77 +void verify_case(const string& Expected, const string& Received) { 78 + bool ok = (Expected == Received); 79 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 80 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 81 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 82 +#define END verify_case(_, TellBagsApart().whichBagIsSmaller(records));} 83 +int main(){ 84 + 85 +CASE(0) 86 + int records_[] = {262, 371, 340, 277, 303, 304, 333, 310, 87 + 296, 326, 370, 275, 312, 329, 284, 308, 88 + 265, 402, 372, 279, 279, 317, 307, 279, 89 + 112, 160, 121, 102, 497, 497, 505, 506}; 90 + vector <int> records(records_, records_+sizeof(records_)/sizeof(*records_)); 91 + string _ = "1111"; 92 +END 93 +CASE(1) 94 + int records_[] = {401, 405, 345, 358, 203, 295, 284, 209, 95 + 348, 380, 396, 361, 221, 274, 307, 213, 96 + 361, 347, 410, 347, 246, 287, 298, 204, 97 + 301, 389, 412, 304, 253, 289, 280, 272, 98 + 303, 450, 388, 290, 270, 286, 246, 267, 99 + 328, 354, 326, 362, 254, 305, 309, 262, 100 + 290, 362, 391, 296, 285, 282, 313, 281, 101 + 338, 335, 345, 335, 220, 338, 335, 254, 102 + 309, 356, 348, 323, 239, 344, 343, 238, 103 + 264, 368, 365, 258, 301, 312, 328, 304, 104 + 256, 368, 343, 295, 296, 323, 319, 300, 105 + 275, 318, 383, 258, 320, 340, 306, 300, 106 + 275, 301, 323, 309, 273, 372, 366, 281, 107 + 263, 331, 290, 309, 277, 358, 395, 277, 108 + 261, 310, 291, 259, 301, 407, 379, 292, 109 + 256, 318, 297, 257, 325, 358, 366, 323, 110 + 284, 287, 274, 286, 294, 406, 358, 311, 111 + 266, 271, 282, 256, 282, 395, 429, 319, 112 + 270, 274, 278, 268, 308, 396, 404, 302, 113 + 203, 283, 299, 229, 368, 401, 377, 340}; 114 + vector <int> records(records_, records_+sizeof(records_)/sizeof(*records_)); 115 + string _ = "22211212211122212221"; 116 +END 117 +/* 118 +CASE(2) 119 + int records_[] = ; 120 + vector <int> records(records_, records_+sizeof(records_)/sizeof(*records_)); 121 + string _ = ; 122 +END 123 +CASE(3) 124 + int records_[] = ; 125 + vector <int> records(records_, records_+sizeof(records_)/sizeof(*records_)); 126 + string _ = ; 127 +END 128 +*/ 129 +} 130 +// END CUT HERE
Added SRM/TCO21-3A-U/1C-U.cpp version [556c57b27a57d85a]
1 +#include <iostream> 2 +#include <sstream> 3 +#include <iomanip> 4 +#include <vector> 5 +#include <string> 6 +#include <map> 7 +#include <set> 8 +#include <algorithm> 9 +#include <numeric> 10 +#include <iterator> 11 +#include <functional> 12 +#include <complex> 13 +#include <queue> 14 +#include <stack> 15 +#include <cmath> 16 +#include <cassert> 17 +#include <tuple> 18 +using namespace std; 19 +typedef long long LL; 20 +typedef complex<double> CMP; 21 + 22 +class TowerPlacement { public: 23 + int solve(int R, int C, int seed, int X) 24 + { 25 + vector<int> qr(50000), qc(50000); 26 + LL state = seed; 27 + for (int i = 0; i < 50000; ++i) { 28 + state = (state * 1103515245 + 12345) & 0x7fffffffLL; 29 + qr[i] = (state / 1000) % R; 30 + state = (state * 1103515245 + 12345) & 0x7fffffffLL; 31 + qc[i] = (state / 1000) % C; 32 + } 33 + 34 + vector<bool> rej(50000); 35 + for (int r = 0; r < X; ++r) { 36 + int L = 0, R = 50001; 37 + while (R - L > 1) { 38 + int M = (L + R) / 2; 39 + (feasible(R,C,qr,qc,rej,M) ? L : R) = M; 40 + } 41 + if (L == 50000) 42 + return -1; 43 + if (r == X - 1) 44 + return L; 45 + rej[L] = true; 46 + } 47 + } 48 + 49 + // Is placing [0, M) feasible? 50 + bool feasible(int R, int C, const vector<int>& qr, const vector<int>& qc, const vector<bool>& rej, int M) { 51 + #define ENC(r,c) ((r)*C+(c)) 52 + map<int, int> t; 53 + for (int i = 0; i < M; ++i) { 54 + if (rej[i]) 55 + continue; 56 + int key = ENC(qr[i], qc[i]); 57 + if (t.count(key)) 58 + continue; 59 + 60 + t[key] = i; 61 + 62 + // conflict generation 63 + qr[i]+1, qc[i] 64 + } 65 + // solve 66 + return false; 67 + #undef ENC 68 + } 69 +}; 70 + 71 +// BEGIN CUT HERE 72 +#include <ctime> 73 +double start_time; string timer() 74 + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 75 +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 76 + { os << "{ "; 77 + for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 78 + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 79 +void verify_case(const int& Expected, const int& Received) { 80 + bool ok = (Expected == Received); 81 + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 82 + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 83 +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 84 +#define END verify_case(_, TowerPlacement().solve(R, C, seed, X));} 85 +int main(){ 86 + 87 +CASE(0) 88 + int R = 1; 89 + int C = 1; 90 + int seed = 47; 91 + int X = 5; 92 + int _ = 4; 93 +END 94 +CASE(1) 95 + int R = 3; 96 + int C = 3; 97 + int seed = 47; 98 + int X = 4; 99 + int _ = 6; 100 +END 101 +CASE(2) 102 + int R = 10000; 103 + int C = 14700; 104 + int seed = 12345; 105 + int X = 1; 106 + int _ = -1; 107 +END 108 +CASE(3) 109 + int R = 10; 110 + int C = 12; 111 + int seed = 123456789; 112 + int X = 3; 113 + int _ = 19; 114 +END 115 +/* 116 +CASE(4) 117 + int R = ; 118 + int C = ; 119 + int seed = ; 120 + int X = ; 121 + int _ = ; 122 +END 123 +CASE(5) 124 + int R = ; 125 + int C = ; 126 + int seed = ; 127 + int X = ; 128 + int _ = ; 129 +END 130 +*/ 131 +} 132 +// END CUT HERE