其他分享
首页 > 其他分享> > 1008 立方数 素数筛求约数 stl黑科技 二分 数论

1008 立方数 素数筛求约数 stl黑科技 二分 数论

作者:互联网

分析

 

首度。我开vector,开map 都是tle,改成数组和cnt 计数就对了。

//-------------------------代码----------------------------

#define int ll
const int N = 1e5+10;
int n,m,primes[N],cnt;
bool st[N];

int qmi(int a,int b) {
    int res = 1;
    while(b) {
        if(b & 1) res = res * a;
        a = a * a ;
        b >>= 1;
    }return res;
}

void solve()
{
    cin>>n;
    map<int,int> mp;
    int ans = 1;
    for(int i = 0;i<cnt;i++) {
        if(n % primes[i] == 0) {
            int cnt = 0;
            while(n % primes[i] == 0) {
                n /= primes[i];
                cnt ++ ;
                if(cnt % 3 == 0) {
                    ans *= primes[i];
                }
            }
        }
    }
    
    int l = 1e5,r = 1e6;
    while( l < r) {
        int mid = l + r  >> 1;
        if(mid * mid * mid == n) {
            ans *= mid;
            break;
        } else if( mid * mid * mid >= n) {
            r = mid;
        } else l = mid + 1;
    }
    cout<<ans<<endl;
}
void get_prime() {
    for(int i = 2;i<=N;i++) {
        if(!st[i]) primes[cnt ++ ] = i;
        for(int j = 0;j < cnt && primes[j] * i <= N;j++) {
            st[primes[j] * i] = 1;
            if(i % primes[j] == 0) break;
        }
    }
}
signed main(){
    clapping();TLE;
    get_prime();
    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

标签:约数,cnt,筛求,stl,res,mid,int,solve,ans
来源: https://www.cnblogs.com/er007/p/16515713.html