Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #pragma GCC optimize("O4")
  4. #pragma GCC optimize("fast-math")
  5.  
  6. using namespace std;
  7. #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  8. const int maxn = 1e5 + 7;
  9. long long mod = 1e9 + 7;
  10.  
  11.  
  12. mt19937 ran( time( 0 ));
  13.  
  14. int n, k;
  15.  
  16. long long ans = 0;
  17.  
  18. inline int random( ) {
  19. return abs(( int ) ran( ));
  20. }
  21.  
  22. long long cnt[maxn];
  23.  
  24. void input( ) {
  25. cin >> n >> k;
  26. int temp;
  27. for ( int i = 0; i < n; i++ ) {
  28. cin >> temp;
  29. cnt[temp]++;
  30. }
  31. }
  32.  
  33. inline long long binpow( long long a, int t ) {
  34. if ( t == 0 ) return 1;
  35. if ( t % 2 == 0 ) {
  36. long long curr = binpow( a, t / 2 );
  37. return curr * curr;
  38.  
  39. } else {
  40. long long curr = binpow( a, t - 1 );
  41. return curr * a;
  42. }
  43. }
  44.  
  45. vector < long long > divisors, primes, st;
  46.  
  47. inline void final_check( int steps, long long der ) {
  48. if ( steps == st.size( )) {
  49. divisors.push_back( der );
  50. return;
  51. }
  52. final_check( steps + 1, der );
  53. for ( int i = 0; i < st[steps]; i++ ) {
  54. der *= primes[steps];
  55. final_check( steps + 1, der );
  56. }
  57. }
  58.  
  59.  
  60. inline void check( long long x ) {
  61. while ( !divisors.empty( ))divisors.pop_back( );
  62. while ( !primes.empty( )) primes.pop_back( );
  63. while ( !st.empty( )) st.pop_back( );
  64.  
  65. int curr = x;
  66. for ( int i = 2; i * i <= curr; i++ ) {
  67. if ( curr % i == 0 ) {
  68. int temp_st = 0;
  69. primes.push_back( i );
  70. while ( curr % i == 0 ) {
  71. curr /= i;
  72. temp_st++;
  73. }
  74. st.push_back( temp_st );
  75. }
  76. }
  77. if ( curr != 1 ) {
  78. primes.push_back( curr );
  79. st.push_back( 1 );
  80. }
  81. for ( int i = 0; i < st.size( ); i++ ) {
  82. st[i] *= k;
  83. }
  84.  
  85. final_check( 0, 1 );
  86.  
  87. long long multed = binpow( x, k );
  88.  
  89. sort( divisors.begin( ), divisors.end( ));
  90.  
  91. for ( long long d:divisors ) {
  92. if ( d > multed / d ) {
  93. break;
  94. }
  95. if ( multed / d <= 1e5 && d <= 1e5 ) {
  96. if ( d * d == multed ) {
  97. ans += (cnt[d] * (cnt[d] - 1) / 2);
  98. } else {
  99. ans += cnt[d] * cnt[multed / d];
  100. }
  101. }
  102. }
  103.  
  104. }
  105.  
  106. void solve( ) {
  107. if ( k > 32 ) {
  108. cout << cnt[1] * (cnt[1] - 1) / 2;
  109. return;
  110. }
  111.  
  112. long long curr_number;
  113. long long curr_step = 1;
  114. while ( true ) {
  115. curr_number = binpow( curr_step, k );
  116. if ( curr_number > 1e10 ) {
  117. break;
  118. } else {
  119. check( curr_step );
  120. }
  121. curr_step++;
  122. }
  123. cout << ans;
  124. }
  125.  
  126. int32_t main( ) {
  127. IOS
  128. input( );
  129. solve( );
  130. return 0;
  131.  
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement