Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <random>
  3.  
  4. using namespace std;
  5.  
  6. typedef unsigned long long ull;
  7. typedef long long ll;
  8. typedef long double ld;
  9. #define int ll
  10. typedef pair<int, int> pii;
  11. typedef pair<pii, pii> piii;
  12. typedef pair<ll, ll> pll;
  13. typedef vector<int> vi;
  14. typedef vector<pii> vpi;
  15. typedef vector< vi > vvi;
  16. typedef vector< vvi > vvvi;
  17. typedef vector<short> vs;
  18. typedef vector<vs> vvs;
  19. typedef vector<vvs> vvvs;
  20. typedef vector<ll> vl;
  21. typedef vector<vl> vvl;
  22. typedef vector<vvl> vvvl;
  23. typedef vector<ld> vld;
  24. typedef vector<vld> vvld;
  25. typedef vector<vvld> vvvld;
  26. typedef vector<string> vst;
  27. typedef vector<vst> vvst;
  28. typedef pair<ld, ld> pld;
  29. //typedef complex<double> base;
  30.  
  31. #define inmin(a, b) a = min(a, (b))
  32. #define inmax(a, b) a = max(a, (b))
  33. //#define mp(a, b) make_pair((a), (b))
  34. #define ALL(a) a.begin(),a.end()
  35. #define RALL(a) a.rbegin(),a.rend()
  36. #define sqr(x) ((x) * (x))
  37. #define fori(i, n) for(int i = 0; i < int(n); ++i)
  38. #define SZ(a) ((int)((a).size()))
  39. #define watch(x) cerr << (#x) << " = " << (x) << endl;
  40.  
  41. #ifdef MAX_HOME
  42. #define cerr cout
  43. #else
  44. #define cerr if (false) cerr
  45. #endif
  46.  
  47. const double PI = 2 * acos(0.0);
  48. #define rand dont_do_this_please_kek_lol
  49. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  50. mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());
  51.  
  52. const string DIGITS = "0123456789";
  53. const string ALPH = "abcdefghijklmnopqrstuvwxyz";
  54.  
  55. template <class T0, class T1>
  56. inline ostream & operator << (ostream &out, pair<T0, T1> &a) {
  57. return out << "{" << a.first << ", " << a.second << "}";
  58. }
  59.  
  60. template <class T0, class T1, class T2>
  61. inline ostream & operator << (ostream &out, tuple<T0, T1, T2> &a) {
  62. return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a) << "}";
  63. }
  64.  
  65. template <class T0, class T1, class T2, class T3>
  66. inline ostream & operator << (ostream &out, tuple<T0, T1, T2, T3> &a) {
  67. return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a) << ", " << get<3>(a) << "}";
  68. }
  69.  
  70. template<class T>
  71. inline ostream & operator << (ostream &out, vector<T> &a) {
  72. out << "[";
  73. fori (i, a.size())
  74. out << a[i] << vector<string>{", ", "] "}[i + 1 == a.size()];
  75. return out;
  76. }
  77.  
  78.  
  79.  
  80. void smain();
  81.  
  82. signed main() {
  83. ios::sync_with_stdio(0);
  84. cin.tie(0); cout.tie(0);
  85.  
  86. #ifdef MAX_HOME
  87. freopen("input.txt", "r", stdin);
  88. clock_t start = clock();
  89. #else
  90. // freopen("keke.in", "r", stdin);
  91. // freopen("kek.out", "w", stdout);
  92. #endif
  93. cout << setprecision(12) << fixed;
  94. smain();
  95. #ifdef MAX_HOME
  96. cout << "\n\n\n\nTOTAL EXECUTION TIME: " << float( clock () - start ) / CLOCKS_PER_SEC << endl;
  97. #endif
  98. return 0;
  99. }
  100.  
  101. const int M = 1e9 + 7;
  102. int MH , x;
  103. int MH2, x2;
  104. const int L = 1e5 + 10;
  105. //int pwx[L];
  106.  
  107. int pw(int a, int n = M - 2) {
  108. int ret = 1;
  109. while (n) {
  110. if (n & 1)
  111. ret = (ll) ret * a % M;
  112. a = (ll) a * a % M;
  113. n >>= 1;
  114. }
  115. return ret;
  116. }
  117.  
  118. ull hsh(vi a) {
  119. ull ret = 0;
  120. int ret2 = 0;
  121. for (auto item : a) {
  122. ++item;
  123. ret = (ll) ret * x % MH;
  124. ret = (ret + item) % MH;
  125. ret2 = (ll) ret2 * x2 % MH2;
  126. ret2 = (ret2 + item) % MH2;
  127. }
  128. ret = (ull)ret ^ (((ull)ret2) << 32);
  129. return ret;
  130. }
  131.  
  132. const int N = 2020;
  133.  
  134. struct edge {
  135. int from, to, dig;
  136. };
  137. vector<edge> e;
  138. vi g[N], rg[N];
  139. bool can_use[N];
  140. int q[N + N];
  141.  
  142. void bfs(int s) {
  143. int ql, qr;
  144. ql = qr = 0;
  145. q[qr++] = s;
  146. while (ql < qr) {
  147. int v = q[ql++];
  148. can_use[v] = true;
  149. for (int id : rg[v]) {
  150. int to = e[id].from;
  151. if (!can_use[to]) {
  152. can_use[to] = true;
  153. q[qr++] = to;
  154. }
  155. }
  156. }
  157. }
  158.  
  159.  
  160.  
  161. void solve() {
  162. int n, m;
  163. cin >> n >> m;
  164. e.clear();
  165. fori (i, n) {
  166. g[i].clear();
  167. rg[i].clear();
  168. can_use[i] = false;
  169. }
  170. fori (iter, m) {
  171. int u, v, dig;
  172. cin >> u >> v >> dig;
  173.  
  174. g[u].push_back(e.size());
  175. rg[v].push_back(e.size());
  176. e.push_back({u, v, dig});
  177. }
  178.  
  179. bfs(1);
  180. vi prv;
  181. map<ull, int> was;
  182. vi s;
  183. prv = {0};
  184. was[hsh(prv)] = 0;
  185.  
  186. for (int i = 0; ; ++i) {
  187. int mindig = 10;
  188. for (int v : prv) {
  189. for (int id : g[v]) {
  190. int to = e[id].to;
  191. if (can_use[to]) {
  192. inmin(mindig, e[id].dig);
  193. }
  194. }
  195. }
  196. assert(mindig < 10);
  197.  
  198. vi kek = prv;
  199. prv.clear();
  200. for (int v : kek) {
  201. for (int id : g[v]) {
  202. int to = e[id].to;
  203. if (can_use[to] && mindig == e[id].dig) {
  204. prv.push_back(to);
  205. }
  206. }
  207. }
  208. sort(ALL(prv));
  209. prv.resize(unique(ALL(prv)) - prv.begin());
  210.  
  211. s.push_back(mindig);
  212. if (binary_search(ALL(prv), 1)) {
  213.  
  214. ll ans = 0;
  215. ll ten = pw(10);
  216. for (int k = 0; k < s.size(); ++k) {
  217. ans = (ans + (ll)s[k] * ten) % M;
  218. ten = ((ll) ten * pw(10)) % M;
  219. }
  220.  
  221. cout << ans;
  222. return;
  223. }
  224.  
  225.  
  226. if (was.count(hsh(prv))) {
  227.  
  228. int j = was[hsh(prv)];
  229. int lol = s.size();
  230. int len = lol - j;
  231. ll ans = 0;
  232. ll ten = pw(10);
  233. for (int k = 0; k < j; ++k) {
  234. ans = (ans + (ll)s[k] * ten) % M;
  235. ten = (ll) ten * pw(10) % M;
  236. }
  237.  
  238. ll kek = 0;
  239. for (int k = j; k < lol; ++k) {
  240. kek *= 10;
  241. kek += s[k];
  242. kek %= M;
  243. }
  244. kek = (ll) kek * pw(pw(10, lol)) % M;
  245.  
  246. kek = (ll) kek * pw(1LL + M - pw(pw(10, len))) % M;
  247. ans = (ans + kek) % M;
  248. cout << ans;
  249. return;
  250. }
  251.  
  252. was[hsh(prv)] = i + 1;
  253.  
  254.  
  255. }
  256. }
  257.  
  258. bool is_prime(int M) {
  259. for (int j = 2; j * j <= M; ++j) {
  260. if (M % j == 0)
  261. return false;
  262. }
  263. return true;
  264. }
  265.  
  266. void smain() {
  267.  
  268. // watch(31 * pw(1LL + M - pw(100)) % M);
  269.  
  270. for (MH = rng() % 10000000 + 1000000000; !is_prime(MH); ++MH);
  271. for (x = rng() % 2000 + 2020; !is_prime(x); ++x);
  272. for (MH2 = rng() % 10000000 + 1000000000; !is_prime(MH2); ++MH2);
  273. for (x2 = rng() % 2000 + 2020; !is_prime(x2); ++x2);
  274.  
  275.  
  276. int t;
  277. cin >> t;
  278.  
  279. for (int i = 1; i <= t; ++i) {
  280. cout << "Case #" << i << ": ";
  281. solve();
  282. if (i != t) {
  283. cout << '\n';
  284. }
  285. }
  286.  
  287.  
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement