2018-team7-CF28

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

前两题比较水 

有点小坑

第三题数论做不出

题意:L到R中满足 a的p次==x的个数   1e18范围

显然答案为cal(r)-cal(l-1)

p=2
4 9 16 25 36 49 64 81 100 ...
可以发现个数为sqrt(x) 下取整

p=3 往上就可以枚举了 把不能开根的放入vector

{{{
#!C
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> v;
ll solve(ll x){
    return upper_bound(v.begin(),v.end(),x)-v.begin()+sqrt(x);
}
const ll MAXN = 1e18;
int main(){
    int q;
    cin>>q;
    for(ll i=2;i<=1000000;++i){
        ll j= i*i;
        while(j<=MAXN/i){
            j*=i;
            ll s = sqrt(j);
            if(s*s!=j)v.push_back(j);
        }
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    while(q--){
        ll l,r;
        cin>>l>>r;
        cout<<solve(r)-solve(l-1)<<endl;
    }
    return 0;
}


}}}

刚开始看到幂次为2有1e9觉得不可做= =其实应该想到再往上一点的

前两题比较水

有点小坑

第三题数论做不出

题意:L到R中满足 a的p次==x的个数 1e18范围

显然答案为cal(r)-cal(l-1)

p=2

4 9 16 25 36 49 64 81 100 ...

可以发现个数为sqrt(x) 下取整

p=3 往上就可以枚举了 把不能开根的放入vector

#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> v;
ll solve(ll x){
    return upper_bound(v.begin(),v.end(),x)-v.begin()+sqrt(x);
}
const ll MAXN = 1e18;
int main(){
    int q;
    cin>>q;
    for(ll i=2;i<=1000000;++i){
        ll j= i*i;
        while(j<=MAXN/i){
            j*=i;
            ll s = sqrt(j);
            if(s*s!=j)v.push_back(j);
        }
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    while(q--){
        ll l,r;
        cin>>l>>r;
        cout<<solve(r)-solve(l-1)<<endl;
    }
    return 0;
}

刚开始看到幂次为2有1e9觉得不可做= =其实应该想到再往上一点的