Advertisement
ekzolot

Untitled

Feb 8th, 2024
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int mod=1000000007;
  5. vector<int> powers(int n){
  6. vector<int> q(n+1);
  7. q[0]=1;
  8. for (int i=1; i<=n; i++){
  9. q[i]=q[i-1]*2;
  10. q[i]%=mod;
  11. }
  12. return q;
  13. }
  14. void dfs(vector<vector<int>>& graph, vector<bool>& used, int u, vector<int>& c, vector<int>& ans, vector<int>& q){
  15. used[u]=true;
  16. c[u]=1;
  17. int a=0;
  18. for (int v:graph[u]){
  19. if (!used[v]){
  20. dfs(graph, used, v, c, ans, q);
  21. c[u]+=c[v];
  22. a-=(q[c[v]]-1);
  23. a%=mod;
  24. if (a<0){
  25. a+=mod;
  26. }
  27. }
  28. }
  29. a+=(q[c[u]]-1);
  30. a%=mod;
  31. if (a<0){
  32. a+=mod;
  33. }
  34. ans[u]=a;
  35. }
  36. signed main(){
  37. int t;
  38. cin>>t;
  39. while(t--){
  40. int n;
  41. cin>>n;
  42. vector<int> q=powers(2*n);
  43. vector<int> p(n);
  44. vector<vector<int>> graph(n);
  45. int x=0;
  46. for (int i=0; i<n; i++){
  47. cin>>p[i];
  48. p[i]--;
  49. if (p[i]!=i){
  50. graph[i].push_back(p[i]);
  51. graph[p[i]].push_back(i);
  52. }else{
  53. x=i;
  54. }
  55. }
  56. vector<int> c(n);
  57. vector<int> ans(n);
  58. vector<bool> used(n);
  59. dfs(graph, used, x, c, ans, q);
  60. int sum=0;
  61. for (int i=0; i<n; i++){
  62. sum+=(i+1)*ans[i];
  63. sum%=mod;
  64. }
  65. cout<<sum<<"\n";
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement