Advertisement
esraa_syam

L

Jul 21st, 2024
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. #define nl "\n"
  5. #define ll long long
  6. #define mod  1'000'000'007
  7. #define all(v) v.begin(), v.end()
  8. #define rall(v) v.rbegin(), v.rend()
  9. #define sz(v) (int) v.size()
  10.  
  11. template<typename T = int>
  12. istream &operator>>(istream &in, vector<T> &v) {
  13.     for (auto &x: v) in >> x;
  14.     return in;
  15. }
  16.  
  17.  
  18. template<typename T = int>
  19. ostream &operator<<(ostream &out, const vector<T> &v) {
  20.     for (const T &x: v) out << x << " ";
  21.     return out;
  22. }
  23.  
  24. void Sira() {
  25.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  26. #ifndef ONLINE_JUDGE
  27.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  28. #endif
  29. }
  30.  
  31. vector < vector < int > > adj;
  32. int n;
  33.  
  34. vector < int > primes , vis;
  35.  
  36. const int N = 2e5 + 5;
  37. vector < bool > is_prime(N, true);
  38.  
  39. void Sieve(){
  40.     is_prime[0] = false;
  41.     is_prime[1] = false;
  42.     for(long long i = 2; i * i < N; i++)
  43.         if(is_prime[i])
  44.             for(int j = 2 * i; j < N; j += i)
  45.                 is_prime[j] = false;
  46. }
  47.  
  48. vector < ll > cnt;
  49.  
  50. int target;
  51.  
  52. int dfs(int src){
  53.     vis[src] = 1;
  54.  
  55.     int ans = 0;
  56.  
  57. //    cout << src << " ---->" << nl;
  58.  
  59.     for(auto & nxt : adj[src]){
  60.         if(!vis[nxt] and !is_prime[nxt]){
  61.             int temp = 1 + dfs(nxt);
  62.             ans += temp;
  63. //            cout << temp << " " << src << " " << target << nl;
  64.  
  65.             if(src == target) cnt.push_back(temp);
  66.         }
  67.  
  68.     }
  69.  
  70.     return ans;
  71. }
  72.  
  73.  
  74. void solve(){
  75.     cin >> n;
  76.  
  77.     adj.assign(n + 5 , vector < int > ());
  78.     vis.assign(n + 5 , 0);
  79.  
  80.     for(int i = 0 ; i < n - 1 ; i++){
  81.         int u , v;
  82.         cin >> u >> v;
  83. //        cout << "adj" << " " << u << " " << v << nl;
  84.  
  85.         adj[u].push_back(v);
  86.         adj[v].push_back(u);
  87.     }
  88.  
  89.     for(int i = 1 ; i <= n ; i++){
  90.         if(is_prime[i]) primes.push_back(i);
  91.     }
  92.  
  93.     ll ans = 0 , rem = n - sz(primes) , p = sz(primes);
  94.  
  95.     ans = rem * p + p * (p - 1) / 2;
  96.  
  97.     for(int i = 0 ; i < sz(primes) ; i++){
  98.         target = primes[i];
  99. //        cout << primes[i] << nl;
  100.         dfs(primes[i]);
  101.     }
  102.  
  103.     for(int i = sz(cnt) - 2 ; i >= 0 ; i--){
  104.         cnt[i] += cnt[i + 1];
  105.     }
  106.  
  107.  
  108.     for(int i = 1 ; i < sz(cnt) ; i++){
  109.         ll ele = cnt[i - 1] - cnt[i];
  110.         ele *= cnt[i];
  111.         ans += ele;
  112.     }
  113.  
  114.     cout << ans << nl;
  115.  
  116. }
  117.  
  118. int main() {
  119.     Sira();
  120.     int t = 1;
  121.     Sieve();
  122. //    cin >> t;
  123.     while(t--){
  124.         solve();
  125.     }
  126.     return 0;
  127. }
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement