Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #pragma GCC optimize("O4")
- #pragma GCC optimize("fast-math")
- using namespace std;
- #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- const int maxn = 1e5 + 7;
- long long mod = 1e9 + 7;
- mt19937 ran( time( 0 ));
- int n, k;
- long long ans = 0;
- inline int random( ) {
- return abs(( int ) ran( ));
- }
- long long cnt[maxn];
- void input( ) {
- cin >> n >> k;
- int temp;
- for ( int i = 0; i < n; i++ ) {
- cin >> temp;
- cnt[temp]++;
- }
- }
- inline long long binpow( long long a, int t ) {
- if ( t == 0 ) return 1;
- if ( t % 2 == 0 ) {
- long long curr = binpow( a, t / 2 );
- return curr * curr;
- } else {
- long long curr = binpow( a, t - 1 );
- return curr * a;
- }
- }
- vector < long long > divisors, primes, st;
- inline void final_check( int steps, long long der ) {
- if ( steps == st.size( )) {
- divisors.push_back( der );
- return;
- }
- final_check( steps + 1, der );
- for ( int i = 0; i < st[steps]; i++ ) {
- der *= primes[steps];
- final_check( steps + 1, der );
- }
- }
- inline void check( long long x ) {
- while ( !divisors.empty( ))divisors.pop_back( );
- while ( !primes.empty( )) primes.pop_back( );
- while ( !st.empty( )) st.pop_back( );
- int curr = x;
- for ( int i = 2; i * i <= curr; i++ ) {
- if ( curr % i == 0 ) {
- int temp_st = 0;
- primes.push_back( i );
- while ( curr % i == 0 ) {
- curr /= i;
- temp_st++;
- }
- st.push_back( temp_st );
- }
- }
- if ( curr != 1 ) {
- primes.push_back( curr );
- st.push_back( 1 );
- }
- for ( int i = 0; i < st.size( ); i++ ) {
- st[i] *= k;
- }
- final_check( 0, 1 );
- long long multed = binpow( x, k );
- sort( divisors.begin( ), divisors.end( ));
- for ( long long d:divisors ) {
- if ( d > multed / d ) {
- break;
- }
- if ( multed / d <= 1e5 && d <= 1e5 ) {
- if ( d * d == multed ) {
- ans += (cnt[d] * (cnt[d] - 1) / 2);
- } else {
- ans += cnt[d] * cnt[multed / d];
- }
- }
- }
- }
- void solve( ) {
- if ( k > 32 ) {
- cout << cnt[1] * (cnt[1] - 1) / 2;
- return;
- }
- long long curr_number;
- long long curr_step = 1;
- while ( true ) {
- curr_number = binpow( curr_step, k );
- if ( curr_number > 1e10 ) {
- break;
- } else {
- check( curr_step );
- }
- curr_step++;
- }
- cout << ans;
- }
- int32_t main( ) {
- IOS
- input( );
- solve( );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement