Submission #35150044


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>
using mint = atcoder::modint998244353;
using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)n;i++)
int read(){int r;scanf("%d",&r);return r;}

const int N = 1e5;

int a[N+10];
vector<int> G[N+10]; // G[u] = {v}
vector<int> ys2i[N+10]; // ys2i[因数] = {点id}
bool vis[N+10];
int siz[N+10]; // 当前子树大小

int dfs1(int u,int fa,int d) { // return 子树大小
  vis[u] = true;
  siz[u] = 1;
  for(auto v:G[u]) if(v!=fa && a[v]%d==0) siz[u] += dfs1(v,u,d);
  return siz[u];
}

mint dfs2(int u, int fa, int sz/*联通块总大小*/, int d){
  vis[u] = false;
  mint r = 0;
  mint pre = sz - siz[u] + 1; // 父方向 节点数 包括u; 树上换根 + 前缀和dp
  r += pre;
  for(auto v : G[u]) if(v!=fa && a[v]%d==0){
    r += pre * siz[v]; // 当前v级子树的点和 前面点覆盖了u的路径数
    pre += siz[v];
    r += dfs2(v, u, sz, d);
  }
  return r;
}

int phi[N+10]; // phi(i)
int main() {
  { // calc phi
    iota(phi,phi+N+1,0);
    vector<bool> p(N+1,0); // prime vis
    rep(i,2,N+1) if(!p[i]) for(int j=i;j<=N;j+=i){ // j = ki
      p[j] = true;
      (phi[j] /= i) *= (i-1);
    }
  }
  int n = read();
  {
    vector<vector<int>>ys(N+1); // ys[i] = {i的因数}
    rep(i,1,N+1) for(int j=i;j<=N;j+=i) ys[j].push_back(i); // 计算因子
    rep(i,0,n) {
      a[i] = read(); // 0-index
      for(auto x:ys[a[i]]) ys2i[x].push_back(i);
    }
    rep(i,1,n){
      int u = read()-1;
      int v = read()-1;
      G[u].push_back(v);
      G[v].push_back(u);
    }
  }
  mint ans = 0;
  rep(d,1,N+1){ // \phi(d) * 路径上全是d的倍数的路径长度和 = \phi(d) * sum(每个点被边覆盖的次数)
    mint r = 0;
    for(auto u:ys2i[d]) if(!vis[u]) dfs1(u,u,d);
    for(auto u:ys2i[d]) if(vis[u]) r += dfs2(u,u,siz[u],d); 
    ans += phi[d] * r;
  }
  rep(i,0,n) ans -= a[i]; // 去掉单点
  printf("%d\n", ans.val());
  return 0;
}

Submission Info

Submission Time
Task G - GCD cost on the tree
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 1930 Byte
Status AC
Exec Time 1989 ms
Memory 77864 KiB

Compile Error

./Main.cpp: In function ‘int read()’:
./Main.cpp:6:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    6 | int read(){int r;scanf("%d",&r);return r;}
      |                  ~~~~~^~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 39
Set Name Test Cases
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, hand_07.txt, hand_08.txt, hand_09.txt, hand_10.txt, hand_11.txt, hand_12.txt, hand_13.txt, hand_14.txt, hand_15.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt
Case Name Status Exec Time Memory
example_00.txt AC 56 ms 18860 KiB
example_01.txt AC 60 ms 18788 KiB
hand_00.txt AC 764 ms 73928 KiB
hand_01.txt AC 402 ms 57680 KiB
hand_02.txt AC 685 ms 66972 KiB
hand_03.txt AC 255 ms 30080 KiB
hand_04.txt AC 249 ms 29496 KiB
hand_05.txt AC 1989 ms 76808 KiB
hand_06.txt AC 1512 ms 70552 KiB
hand_07.txt AC 1036 ms 69996 KiB
hand_08.txt AC 1039 ms 69732 KiB
hand_09.txt AC 200 ms 32976 KiB
hand_10.txt AC 603 ms 40844 KiB
hand_11.txt AC 1601 ms 69612 KiB
hand_12.txt AC 1008 ms 67624 KiB
hand_13.txt AC 601 ms 41792 KiB
hand_14.txt AC 50 ms 18748 KiB
hand_15.txt AC 50 ms 18760 KiB
random_00.txt AC 1048 ms 70636 KiB
random_01.txt AC 212 ms 33240 KiB
random_02.txt AC 1837 ms 75964 KiB
random_03.txt AC 1896 ms 77864 KiB
random_04.txt AC 1749 ms 72264 KiB
random_05.txt AC 1817 ms 73292 KiB
random_06.txt AC 1766 ms 74496 KiB
random_07.txt AC 707 ms 66864 KiB
random_08.txt AC 180 ms 29996 KiB
random_09.txt AC 830 ms 73996 KiB
random_10.txt AC 587 ms 73796 KiB
random_11.txt AC 790 ms 70868 KiB
random_12.txt AC 557 ms 70144 KiB
random_13.txt AC 804 ms 70684 KiB
random_14.txt AC 1018 ms 65824 KiB
random_15.txt AC 220 ms 29460 KiB
random_16.txt AC 1413 ms 72968 KiB
random_17.txt AC 1380 ms 73468 KiB
random_18.txt AC 1345 ms 69880 KiB
random_19.txt AC 1304 ms 70096 KiB
random_20.txt AC 1340 ms 70124 KiB