Test Instructions B's third question (Haskell) title description
University for four years, why, why, why not study hard, did not find the same job as you.
B June one day to see such a problem, remind of endless memories.
Input \ (n, k\) and a tree \ (n\) points, there is a right, not a bit of power. The distance between two points \ (i, j\) \ (D (i, j) \) is defined as the Benquan and on the path. Please
\[\sum_{1 \leq i < j \leq N} \left\lceil \frac{d (i,j)}{k} \right\rceil\]
In other words, enumerate the unordered two points and find out the sum of the distance divided by \ (k\) rounding.
Input format
Enter the first line containing two integers \ (n, k\).
Next \ (n-1\) line, three integers per line (x, y, z\), indicates that there is an edge between \ (x\) and \ (y\) , and that the edge is \ (z\).
Output format
Outputs an integer that represents the answer.
Sample input
4 6
1 2 2
1 3 3
1 4 4
Sample output
7
Data size and conventions
For 100% of data, meet \ (1 \leq n \leq 100000, 1 \leq k \leq 10\).
For 100% of data, satisfy \ (1 \leq x, y \leq N, 1 \leq z \leq 10\).
For 30% of data, satisfy \ (n \leq 1000\).
For another 20% of the data, satisfy \ (k = 1\).
For another 20% of the data, satisfy \ (k = 2\).
Analysis
It is a classic question to consider the situation without rounding first.
Then consider how many paths modulus K remainder 1, 2, ....
This is a good question NOI2011 road construction and BZOJ2152 Cong cocoa adaptation.
\[\lceil \frac{x}{k} \rceil = \frac{x + k-x \mod{k}}{k}\]
So we need to find out how many path modulus K equals,.. K-1.
Consider DP.
Using \ (f (i,j) \) indicates how many points to I in the subtree of i mod k = j,\ (c (i) \) indicates how many paths to the global mod k = i.
F, C can be found at the time of Dfs, attention to order, can not use subtree on their own scheme.
Code
#include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <iostream > #include <string> #include <vector> #include <list> #include <deque> #include <stack> #include <queue> #include <map> #include <set> #include <bitset> #include <algorithm># include<complex> #define RG Register#define il inline#define co const#pragma GCC optimize ("O0") using namespace std; Template<class t> il t read (RG t&x) {RG T data=0; RG int w=1; RG Char Ch=getchar (); while (!isdigit (CH)) {if (ch== '-') w=-1; Ch=getchar (); } while (IsDigit (CH)) data=10*data+ch-' 0 ', Ch=getchar (); return x=data*w;} typedef long LONG ll;const int inf=0x7fffffff;const int maxn=1e5+7,maxk=11;int n,k;struct edge{int nx,to,w;} E[maxn<<1];int head[maxn],ecnt;void Addedge (RG int X,RG int Y,RG int w) {e[++ecnt].to=y,e[ecnt].w=w; e[ecnt].nx=head[x],head[x]=ecnt;} int Siz[maxn];int F[MAXN] [Maxk];ll c[maxn];ll Ans;il void dfs (RG int X,RG int fa) {siz[x]=1; F[x][0]=1; for (RG int i=head[x];i;i=e[i].nx) {RG int y=e[i].to,w=e[i].w; if (Y==FA) continue; DFS (Y,X); Siz[x]+=siz[y]; Ans + = (ll) (N-siz[y]) * Siz[y] * W; for (RG int p=0;p<k;++p) for (RG int q=0;q<k;++q) c[(p + q + W)% K] + = f[x][p] * F[y][q]; for (RG int j=0;j<k;++j) f[x][(j + W)% K] + = f[y][j]; }}int Main () {freopen ("haskell.in", "R", stdin); Freopen ("Haskell.out", "w", stdout); Read (n); read (k); for (RG int i=1;i<n;++i) {RG int x,y,w; Read (x); Read (y); Read (w); Addedge (X,Y,W); Addedge (Y,X,W); } dfs (1,0); for (RG int i=1;i<k;++i) {ans + = (k-i) * C[i]; } printf ("%lld\n", ans/k);//fclose (stdin);//fclose (stdout); return 0;}
Test20181016 B's third question