Submission #00163
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #include <bits/stdc++.h> #define REP(i,n) for(int i=0;i<(int)(n);i++) #define ALL(x) (x).begin(),(x).end() using namespace std; using ll = long long ; template < int M, bool IsPrime = false > class Modulo { using ll = long long ; int n; static enable_if_t<IsPrime, ll> inv(ll a, ll p) { return (a == 1 ? 1 : (1 - p * inv(p%a, a)) / a + p); } public : Modulo () : n(0) {;} Modulo ( int m) : n(m) { if (n >= M) n %= M; else if (n < 0) n = (n % M + M) % M; } Modulo (ll m) { if (m >= M) m %= M; else if (m < 0) m = (m % M + M) % M; n = m; } explicit operator int () const { return n; } explicit operator ll() const { return n; } bool operator==( const Modulo &a) const { return n == a.n; } Modulo operator+=( const Modulo &a) { n += a.n; if (n >= M) n -= M; return * this ; } Modulo operator-=( const Modulo &a) { n -= a.n; if (n < 0) n += M; return * this ; } Modulo operator*=( const Modulo &a) { n = (ll(n) * a.n) % M; return * this ; } Modulo operator+( const Modulo &a) const { Modulo res = * this ; return res += a; } Modulo operator-( const Modulo &a) const { Modulo res = * this ; return res -= a; } Modulo operator*( const Modulo &a) const { Modulo res = * this ; return res *= a; } Modulo operator^(ll n) const { if (n == 0) return Modulo(1); const Modulo a = * this ; Modulo res = (a * a) ^ (n / 2); return n % 2 ? res * a : res; } enable_if_t<IsPrime, Modulo> operator/( const Modulo &a) const { return * this * inv(ll(a), M); } }; const int mod = 1000000007; template < int M = mod> Modulo<M, true > fact( int n, bool sw = true ) { static vector<Modulo<M, true >> v1 = {1}, v2 = {1}; if (n >= ( int )v1.size()) { const int from = v1.size(), to = n + 1024; v1.reserve(to); v2.reserve(to); for ( int i = from; i < to; ++i) { v1.push_back(v1.back() * Modulo<M, true >(i)); v2.push_back(v2.back() / Modulo<M, true >(i)); } } return sw ? v1[n] : v2[n]; } template < int M = mod> Modulo<M, true > comb( int a, int b) { if (b < 0 || b > a) return 0; return fact<M>(a, true ) * fact<M>(b, false ) * fact<M>(a-b, false ); } using Mod = Modulo<mod, true >; int main() { int n; cin >> n; vector<pair< int , int >> vec; REP(i,n) { int a, b; cin >> a >> b; vec.emplace_back(a, b); } sort(ALL(vec)); Mod res1 = 0; Mod res2 = 1; if (vec.front().first == 0) { auto it1 = lower_bound(ALL(vec), make_pair(0, 0)); auto it2 = lower_bound(ALL(vec), make_pair(1, 0)); if (it2 == end(vec)) { cout << int (res1) << endl; cout << int (res2) << endl; return 0; } res2 = Mod(fact(it2 - it1)); auto p = *it2; auto it3 = upper_bound(ALL(vec), p); res2 *= Mod(fact(it3 - it2)); auto it4 = lower_bound(ALL(vec), make_pair(p.first + 1, 0)); res2 *= Mod(fact(it4 - it2 - 1)); res1 = ((Mod(10) ^ p.second) - 1) / Mod(9) * Mod(p.first); ll sum = 0; for (auto it = it1; it != it2; ++it) sum += it->second; Mod ten = Mod(10) ^ sum; res1 = res1 * ten; sum = 0; for (auto it = it2 + 1; it != it4; ++it) sum += it->second; ten = Mod(10) ^ sum; res1 = res1 * ten + (ten - 1) / Mod(9) * Mod(it2->first); sum = 0; for ( int i = p.first + 1; i < 10; ++i) { auto it1 = lower_bound(ALL(vec), make_pair(i, 0)); auto it2 = lower_bound(ALL(vec), make_pair(i + 1, 0)); res2 *= Mod(fact(it2 - it1)); sum = 0; for (auto it = it1; it != it2; ++it) sum += it->second; ten = Mod(10) ^ sum; res1 = res1 * ten + (ten - 1) / Mod(9) * Mod(it1->first); } } else { REP(i,10) { auto it1 = lower_bound(ALL(vec), make_pair(i, 0)); auto it2 = lower_bound(ALL(vec), make_pair(i + 1, 0)); res2 *= Mod(fact(it2 - it1)); ll sum = 0; for (auto it = it1; it != it2; ++it) sum += it->second; Mod ten = Mod(10) ^ sum; // cout << int(ten) << endl; res1 = res1 * ten + (ten - 1) / 9 * Mod(i); } } cout << int (res1) << endl; cout << int (res2) << endl; return 0; } |
ステータス
項目 | データ |
---|---|
問題 | 0003 - repdigit |
ユーザー名 | 鬼勃ち |
投稿日時 | 2017-07-07 21:34:11 |
言語 | C++17 |
状態 | Wrong Answer |
得点 | 0 |
ソースコード長 | 4175 Byte |
最大実行時間 | 85 ms |
最大メモリ使用量 | 2220 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 0 / 100 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
01_sample1.in | AC | 13 ms | 480 KB |
1
|
01_sample2.in | AC | 11 ms | 444 KB |
1
|
01_sample3.in | AC | 14 ms | 408 KB |
1
|
02_handmake1.in | AC | 14 ms | 380 KB |
1
|
02_handmake2.in | WA | 19 ms | 344 KB |
1
|
02_handmake3.in | AC | 17 ms | 568 KB |
1
|
02_handmake4.in | AC | 13 ms | 532 KB |
1
|
02_handmake5.in | AC | 12 ms | 504 KB |
1
|
02_handmake6.in | AC | 14 ms | 472 KB |
1
|
02_handmake7.in | AC | 11 ms | 436 KB |
1
|
02_handmake8.in | AC | 15 ms | 524 KB |
1
|
02_handmake9.in | AC | 12 ms | 496 KB |
1
|
03_random1.in | WA | 12 ms | 588 KB |
1
|
03_random2.in | WA | 16 ms | 424 KB |
1
|
03_random3.in | WA | 13 ms | 516 KB |
1
|
03_random4.in | AC | 12 ms | 608 KB |
1
|
03_random5.in | AC | 15 ms | 696 KB |
1
|
03_random6.in | AC | 12 ms | 660 KB |
1
|
04_random1.in | AC | 13 ms | 620 KB |
1
|
04_random2.in | AC | 12 ms | 584 KB |
1
|
04_random3.in | AC | 13 ms | 548 KB |
1
|
04_random4.in | AC | 11 ms | 508 KB |
1
|
04_random5.in | AC | 20 ms | 596 KB |
1
|
04_random6.in | AC | 12 ms | 560 KB |
1
|
05_random1.in | AC | 65 ms | 1668 KB |
1
|
05_random2.in | AC | 61 ms | 1740 KB |
1
|
05_random3.in | AC | 59 ms | 1688 KB |
1
|
05_random4.in | AC | 62 ms | 1764 KB |
1
|
06_random1.in | AC | 85 ms | 2220 KB |
1
|
06_random3.in | AC | 59 ms | 1760 KB |
1
|