Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.38 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #pragma comment(linker, "/STACK:256000000")
  3. #include <iostream>
  4. #include <fstream>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <cmath>
  8. #include <ctime>
  9. #include <cstring>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <string>
  13. #include <map>
  14. #include <set>
  15. #include <queue>
  16. #include <stack>
  17. #include <deque>
  18. #include <bitset>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <cassert>
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. #define forn(i, n) for (int i = 0; i < n; i++)
  27. #define form(i, n, m) for (int i = n; i <= m; i++)
  28. #define mp make_pair
  29. #define pub push_back
  30. #define XX first
  31. #define YY second
  32. #define db long double
  33. #define all(a) a.begin(), a.end()
  34. #define y1 dsfgsdfgsdfgsdfgsdfgsdfg
  35. #define y0 asdfasdf3rcdt234d5c23xd234dx43
  36. const string LN = "\n";
  37. const double eps = 1e-9;
  38. const double pi = acos(-1.0);
  39. const int INF = (int)1e9 + 7;
  40. const ll LINF = (ll)9e18 + 7;
  41.  
  42. const ll P = 353251;
  43. const ll P1 = 353251;
  44. const ll P2 = 239017;
  45. const ll MOD = 1e9 + 7;
  46. const ll MOD1 = 1e9 + 7;
  47. const ll MOD2 = 1e9 + 9;
  48.  
  49. //
  50. /*
  51. const int MAX_MEM = 2e8;
  52. int mpos = 0;
  53. char mem[MAX_MEM];
  54. void * operator new ( size_t n ) {
  55.     char *res = mem + mpos;
  56.     mpos += n;
  57.     return (void *)res;
  58. }
  59. void operator delete ( void * ) { }
  60. */
  61. //
  62.  
  63. int n, m;
  64. int root;
  65. int p[100007];
  66. int w[100007];
  67. bool del[100007];
  68.  
  69. ll st1[100007];
  70. ll st2[100007];
  71.  
  72. map<int, int> ma, ma2;
  73. ll ans[100007];
  74. vector<pair<int, int> > g[100007];
  75.  
  76. int dfsw(int v, int pred) {
  77.     w[v] = 1;
  78.     for (int i = 0; i < g[v].size(); i++) {
  79.         int to = g[v][i].XX;
  80.         if (to != pred && !del[to])
  81.             w[v] += dfsw(to, v);
  82.     }
  83.  
  84.     return w[v];
  85. }
  86.  
  87. int dfsg(int v, int pred, int ww) {
  88.     for (int i = 0; i < g[v].size(); i++) {
  89.         int to = g[v][i].XX;
  90.         if (to != pred && !del[to]) {
  91.             if (w[to] > ww / 2)
  92.                 return dfsg(to, v, ww);
  93.         }
  94.     }
  95.     return v;
  96. }
  97.  
  98. void dfsans(int v, int pred, ll now, bool f, int hh) {
  99.     if (f)
  100.         ma[now]++;
  101.     else
  102.         ma2[now]++;
  103.  
  104.     for (int i = 0; i < g[v].size(); i++) {
  105.         int to = g[v][i].XX;
  106.         int c = g[v][i].YY;
  107.         ll d = (now + (ll)c * st1[hh]) % m;
  108.         if (to != pred && !del[to]) {
  109.             dfsans(to, v, d, f, hh + 1);
  110.         }
  111.     }
  112. }
  113.  
  114. int rt;
  115.  
  116. void go(int v, int pred, ll now, int hh) {
  117.     if (now == 0)
  118.         ans[rt]++;
  119.     ans[rt] += (ma[(m - now) * st2[hh] % m] - ma2[(m - now) * st2[hh] % m]);
  120.     for (int i = 0; i < g[v].size(); i++) {
  121.         int to = g[v][i].XX;
  122.         int c = g[v][i].YY;
  123.         ll d = (now * (ll)10 + c) % m;
  124.         if (to != pred && !del[to]) {
  125.             go(to, v, d, hh + 1);
  126.         }
  127.     }
  128. }
  129.  
  130. int build(int v) {
  131.     dfsw(v, -1);
  132.     v = dfsg(v, -1, w[v]);
  133.     del[v] = 1;
  134.  
  135.     ma.clear();
  136.  
  137.     for (int i = 0; i < g[v].size(); i++) {
  138.         int to = g[v][i].XX;
  139.         if (!del[to]) {
  140.             dfsans(to, -1, g[v][i].YY % m, 1, 1);
  141.         }
  142.     }
  143.  
  144.     ans[v] += ma[0];
  145.     rt = v;
  146.     //for (pair<int, int> x : ma)
  147.     //  cout << x.XX << ' ' << x.YY << endl;
  148.  
  149.     for (int i = 0; i < g[v].size(); i++) {
  150.         int to = g[v][i].XX;
  151.         if (!del[to]) {
  152.             ma2.clear();
  153.             dfsans(to, -1, g[v][i].YY % m, 0, 1);
  154.             go(to, -1, g[v][i].YY % m, 1);
  155.         }
  156.     }
  157.  
  158.     for (int i = 0; i < g[v].size(); i++) {
  159.         int to = g[v][i].XX;
  160.         if (!del[to]) {
  161.             p[build(to)] = v;
  162.         }
  163.     }
  164.     return v;
  165. }
  166.  
  167. ll bp(ll a, int k) {
  168.     if (k == 1)
  169.         return a;
  170.     if (k & 1) {
  171.         return bp(a, k - 1) * a % m;
  172.     } else {
  173.         ll q = bp(a, k / 2);
  174.         return q * q % m;
  175.     }
  176. }
  177.  
  178. int phi (int n) {
  179.     int result = n;
  180.     for (int i=2; i*i<=n; ++i)
  181.         if (n % i == 0) {
  182.             while (n % i == 0)
  183.                 n /= i;
  184.             result -= result / i;
  185.         }
  186.     if (n > 1)
  187.         result -= result / n;
  188.     return result;
  189. }
  190.  
  191. const bool is_testing = 0;
  192. int main() {
  193.     srand('D' + 'E' + 'N' + 'I' + 'S' + 'S' + 'O' + 'N');
  194.     //ios_base::sync_with_stdio(0); cin.tie(0);
  195.     if (is_testing) {
  196.         freopen("input.txt", "r", stdin);
  197.         freopen("output.txt", "w", stdout);
  198.     } else {
  199.         //freopen("just.in", "r", stdin);
  200.         //freopen("just.out","w", stdout);
  201.     }
  202.     scanf("%d %d", &n, &m);
  203.     if (m == 1) {
  204.         cout << (ll)(n - 1) * (ll)n;
  205.         exit(0);
  206.     }
  207.     st1[1] = 10 % m;
  208.     int ss = phi(m);
  209.     for (int i = 2; i <= 100005; i++)
  210.         st1[i] = (st1[i - 1] * (ll)10) % m;
  211.     for (int i = 1; i <= 100005; i++)
  212.         st2[i] = bp(st1[i], ss - 1);
  213.     for (int i = 0; i < n - 1; i++) {
  214.         int a, b, c;
  215.         scanf("%d %d %d", &a, &b, &c);
  216.         g[a].pub(mp(b, c));
  217.         g[b].pub(mp(a, c));
  218.     }
  219.     root = build(0);
  220.     p[root] = -1;
  221.  
  222.     ll ha = 0;
  223.     for (int i = 0; i < n; i++)
  224.         ha += ans[i];
  225.     cout << ha;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement