fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define endl '\n'
  4. #define int long long int
  5. const int MOD = 1000000007;
  6. const int MOD2 = 998244353;
  7. const int INF = LLONG_MAX / 2;
  8. const int MAXN = 100000;
  9. int primes[1000000];
  10.  
  11. /*void seive() {
  12.   fill(primes, primes + 1000000, 1);
  13.   primes[0] = primes[1] = 0;
  14.   for (int i = 2; i * i < 1000000; i++) {
  15.   if (primes[i]) {
  16.   for (int j = i * i; j < 1000000; j += i) {
  17.   primes[j] = 0;
  18.   }
  19.   }
  20.   }
  21. }
  22.  
  23. bool isPrime(int n) {
  24.   if (n <= 1) return false;
  25.   for (int i = 2; i * i <= n; i++) {
  26.   if (n % i == 0) return false;
  27.   }
  28.   return true;
  29. }
  30.  
  31. int gcd(int a, int b) {
  32.   if (a == 0) return b;
  33.   return gcd(b % a, a);
  34. }*/
  35.  
  36. int power(int a, int b, int mod) {
  37. int res = 1;
  38. a %= mod;
  39. while (b > 0) {
  40. if (b & 1) res = res * a % mod;
  41. a = a * a % mod;
  42. b >>= 1;
  43. }
  44. return res;
  45. }
  46.  
  47. // nCr % MOD for n < MOD
  48. int nCrModP(int n, int r) {
  49. if (r > n) return 0;
  50. if (r == 0 || r == n) return 1;
  51.  
  52. int numerator = 1, denominator = 1;
  53. for (int i = 0; i < r; i++) {
  54. numerator = (numerator * (n - i)) % MOD;
  55. denominator = (denominator * (i + 1)) % MOD;
  56. }
  57. return (numerator * power(denominator, MOD - 2, MOD)) % MOD;
  58. }
  59.  
  60. // Lucas's Theorem
  61. int lucas(int n, int r) {
  62. if (r == 0) return 1;
  63. return (lucas(n / MOD, r / MOD) * nCrModP(n % MOD, r % MOD)) % MOD;
  64. }
  65. void primefactorisation(int n , unordered_map<int,int>&m){
  66. for(int i = 2 ; i<=sqrt(n) ; i++){
  67. if(n%i==0){
  68. int cnt = 0;
  69. while(n%i==0){
  70. cnt++;
  71. n /= i;
  72. }
  73. if(cnt%2!=0){
  74. m[i]++;
  75. }
  76. }
  77. }
  78. if(n>1){
  79. m[n]++;
  80. }
  81. }
  82. void dfs(int node , bool visited[] , vector<int>A[] , int values[] , int &c , unordered_map<int,int>&m1){
  83. visited[node] = true;
  84. c = c+m1[values[node]];
  85. m1[values[node]]++;
  86. for(auto node1 : A[node]){
  87. if(!visited[node1]){
  88. visited[node1] = true;
  89. dfs(node1,visited,A,values,c,m1);
  90. }
  91. }
  92. m1[values[node]]--;
  93. }
  94. void solve() {
  95. int n;
  96. cin>>n;
  97. int values[n];
  98. for(int i = 0 ; i<n ; i++){
  99. cin>>values[i];
  100. unordered_map<int,int>m;
  101. primefactorisation(values[i],m);
  102. int ans = 1;
  103. for(auto i:m){
  104. if(i.second%2!=0){
  105. ans *= i.first;
  106. }
  107. }
  108. values[i] = ans;
  109. m.clear();
  110. }
  111. vector<int>A[n];
  112. bool visited[n+1];
  113. fill(visited,visited+n,false);
  114. unordered_map<int,int>m1;
  115. int c = 0;
  116. for(int i = 0 ; i<n-1 ; i++){
  117. int a,b;
  118. cin>>a>>b;
  119. A[a].push_back(b);
  120. A[b].push_back(a);
  121. }
  122. dfs(0,visited,A,values,c,m1);
  123. cout<<c<<endl;
  124. }
  125.  
  126. signed main() {
  127. ios::sync_with_stdio(false); cin.tie(NULL);
  128. //int t;
  129. //cin >> t;
  130. //while (t--) {
  131. solve();
  132. //}
  133. return 0;
  134. }
  135.  
Success #stdin #stdout 0.01s 5316KB
stdin
5 
4 2 4 4 4 
0 1
1 2
0 3 
3 4
stdout
4