G. GCD Counting

Codeforces
IDCF990G
Time4000ms
Memory256MB
Difficulty
divide and conquerdpdsunumber theorytrees
English · Original
Chinese · Translation
Formal · Original
You are given a tree consisting of $n$ vertices. A number is written on each vertex; the number on vertex $i$ is equal to $a_i$. Let's denote the function $g(x, y)$ as the greatest common divisor of the numbers written on the vertices belonging to the simple path from vertex $x$ to vertex $y$ (including these two vertices). For every integer from $1$ to $2 \cdot 10^5$ you have to count the number of pairs $(x, y)$ $(1 \le x \le y \le n)$ such that $g(x, y)$ is equal to this number. ## Input The first line contains one integer $n$ — the number of vertices $(1 \le n \le 2 \cdot 10^5)$. The second line contains $n$ integers $a_1$, $a_2$, ..., $a_n$ $(1 \le a_i \le 2 \cdot 10^5)$ — the numbers written on vertices. Then $n - 1$ lines follow, each containing two integers $x$ and $y$ $(1 \le x, y \le n, x \ne y)$ denoting an edge connecting vertex $x$ with vertex $y$. It is guaranteed that these edges form a tree. ## Output For every integer $i$ from $1$ to $2 \cdot 10^5$ do the following: if there is no pair $(x, y)$ such that $x \le y$ and $g(x, y) = i$, don't output anything. Otherwise output two integers: $i$ and the number of aforementioned pairs. You have to consider the values of $i$ in ascending order. See the examples for better understanding. [samples]
给你一棵包含 $n$ 个顶点的树。每个顶点上写有一个数字,顶点 $i$ 上的数字为 $a_i$。 定义函数 $g(x, y)$ 为从顶点 $x$ 到顶点 $y$ 的简单路径上所有顶点(包括 $x$ 和 $y$)所写数字的最大公约数。 对于从 $1$ 到 $2 \dot.op 10^5$ 的每个整数,你需要计算满足 $g(x, y)$ 等于该整数的点对 $(x, y)$(其中 $1 \lt.eq x \lt.eq y \lt.eq n$)的数量。 第一行包含一个整数 $n$ —— 顶点的数量 $(1 \lt.eq n \lt.eq 2 \dot.op 10^5)$。 第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$ $(1 \lt.eq a_i \lt.eq 2 \dot.op 10^5)$ —— 写在顶点上的数字。 接下来 $n - 1$ 行,每行包含两个整数 $x$ 和 $y$ $(1 \lt.eq x, y \lt.eq n, x \ne y)$,表示连接顶点 $x$ 和顶点 $y$ 的边。保证这些边构成一棵树。 对于从 $1$ 到 $2 \dot.op 10^5$ 的每个整数 $i$,执行以下操作:如果不存在点对 $(x, y)$ 满足 $x \lt.eq y$ 且 $g(x, y) = i$,则不输出任何内容;否则输出两个整数:$i$ 和满足条件的点对数量。你必须按 $i$ 的升序输出。 详见示例以更好地理解。 ## Input 第一行包含一个整数 $n$ —— 顶点的数量 $(1 \lt.eq n \lt.eq 2 \dot.op 10^5)$。第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$ $(1 \lt.eq a_i \lt.eq 2 \dot.op 10^5)$ —— 写在顶点上的数字。接下来 $n - 1$ 行,每行包含两个整数 $x$ 和 $y$ $(1 \lt.eq x, y \lt.eq n, x \ne y)$,表示连接顶点 $x$ 和顶点 $y$ 的边。保证这些边构成一棵树。 ## Output 对于从 $1$ 到 $2 \dot.op 10^5$ 的每个整数 $i$,执行以下操作:如果不存在点对 $(x, y)$ 满足 $x \lt.eq y$ 且 $g(x, y) = i$,则不输出任何内容;否则输出两个整数:$i$ 和满足条件的点对数量。你必须按 $i$ 的升序输出。详见示例以更好地理解。 [samples]
Let $ T = (V, E) $ be a tree with $ |V| = n $, and let $ a: V \to \mathbb{Z}^+ $ be a function assigning a positive integer $ a_i $ to each vertex $ i \in V $. Define the function $ g(x, y) = \gcd\{ a_v \mid v \in \text{path}(x, y) \} $, where $ \text{path}(x, y) $ denotes the set of vertices on the unique simple path between $ x $ and $ y $ in $ T $, including endpoints. For each integer $ d \in [1, 2 \cdot 10^5] $, let $$ f(d) = \left| \left\{ (x, y) \in V \times V \mid x \leq y,\ g(x, y) = d \right\} \right|. $$ Compute $ f(d) $ for all $ d \in [1, 2 \cdot 10^5] $, and output each pair $ (d, f(d)) $ such that $ f(d) > 0 $, in increasing order of $ d $.
Samples
Input #1
3
1 2 3
1 2
2 3
Output #1
1 4
2 1
3 1
Input #2
6
1 2 4 8 16 32
1 6
6 3
3 4
4 2
6 5
Output #2
1 6
2 5
4 6
8 1
16 2
32 1
Input #3
4
9 16 144 6
1 3
2 3
4 3
Output #3
1 1
2 1
3 1
6 2
9 2
16 2
144 1
API Response (JSON)
{
  "problem": {
    "name": "G. GCD Counting",
    "description": {
      "content": "You are given a tree consisting of $n$ vertices. A number is written on each vertex; the number on vertex $i$ is equal to $a_i$. Let's denote the function $g(x, y)$ as the greatest common divisor of ",
      "description_type": "Markdown"
    },
    "platform": "Codeforces",
    "limit": {
      "time_limit": 4000,
      "memory_limit": 262144
    },
    "difficulty": "None",
    "is_remote": true,
    "is_sync": true,
    "sync_url": null,
    "sign": "CF990G"
  },
  "statements": [
    {
      "statement_type": "Markdown",
      "content": "You are given a tree consisting of $n$ vertices. A number is written on each vertex; the number on vertex $i$ is equal to $a_i$.\n\nLet's denote the function $g(x, y)$ as the greatest common divisor of ...",
      "is_translate": false,
      "language": "English"
    },
    {
      "statement_type": "Markdown",
      "content": "给你一棵包含 $n$ 个顶点的树。每个顶点上写有一个数字,顶点 $i$ 上的数字为 $a_i$。\n\n定义函数 $g(x, y)$ 为从顶点 $x$ 到顶点 $y$ 的简单路径上所有顶点(包括 $x$ 和 $y$)所写数字的最大公约数。\n\n对于从 $1$ 到 $2 \\dot.op 10^5$ 的每个整数,你需要计算满足 $g(x, y)$ 等于该整数的点对 $(x, y)$(其中 $1 \\lt.eq...",
      "is_translate": true,
      "language": "Chinese"
    },
    {
      "statement_type": "Markdown",
      "content": "Let $ T = (V, E) $ be a tree with $ |V| = n $, and let $ a: V \\to \\mathbb{Z}^+ $ be a function assigning a positive integer $ a_i $ to each vertex $ i \\in V $.\n\nDefine the function $ g(x, y) = \\gcd\\{ ...",
      "is_translate": false,
      "language": "Formal"
    }
  ]
}
Full JSON Raw Segments