您的位置:首页 > 其它

Codeforces 614 A Link/Cut Tree

2016-01-15 08:48 288 查看
传送门:http://codeforces.com/contest/614/problem/A

本题会暴long long

237171123124584251 923523399718980912 7150

这组数据得出了一个位于l,r之间的值,而实际上那个值应该是大于r的,本应输出-1,所以错了

还有一组数据,即

1 1000000000000000000 1000000000

应该在下一次有暴longlong的潜能时,及时终止,即不能少一次判断,将此判断写在for循环的终止条件里面,这样会少解的

学到了一个优美的方法解决此问题,即

[code]#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
ll l,r,k;
vector<ll>vec;
int main(){
    /*
    ll ans=2613510006250000
    */
    cin>>l>>r>>k;
    ll ans=1ll;
    for(;ans<=(ll)1e18;){
        if(ans>=l&&ans<=r){
            vec.push_back(ans);
        }
        if(ans>((ll)(9e18))/k) break;
        ans=ans*k;
    }
    if(vec.size()==0) return puts("-1");
    for(int i=0;i<vec.size()-1;i++){
        cout<<vec[i]<<" ";
    }
    cout<<vec[vec.size()-1]<<endl;
    return 0;
}


还有优美的写法,即利用r是在longlong范围内去判断

[code]#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
ll l,r,k;
vector<ll>vec;
int main(){
    /*
    ll ans=2613510006250000
    */
    cin>>l>>r>>k;
    ll ans=1ll;
    for(;ans<=r;){
        if(ans>=l){
            vec.push_back(ans);
        }
        //if(ans>((ll)(9e18))/k) break;
        if(ans<=r/k)
        ans=ans*k;
        else break;
    }
    if(vec.size()==0) return puts("-1");
    for(int i=0;i<vec.size()-1;i++){
        cout<<vec[i]<<" ";
    }
    cout<<vec[vec.size()-1]<<endl;
    return 0;
}


还有这种写法

[code]ll limit = log(2e18) / log(double(k));
    ll res = 1;
    ll count = 0;
    for (int i = 0; i <= limit; i++)
    {
        if (res >= l && res <= r)
        {
            cout << res << ' ';
            ++count;
        }
        res *= k;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: