Codeforces 614 A Link/Cut Tree

来源:互联网 发布:李选民淘宝上卖的真吗 编辑:程序博客网 时间:2024/05/01 18:24

传送门:http://codeforces.com/contest/614/problem/A
本题会暴long long
237171123124584251 923523399718980912 7150
这组数据得出了一个位于l,r之间的值,而实际上那个值应该是大于r的,本应输出-1,所以错了

还有一组数据,即

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

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

#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;#define ll long longll 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范围内去判断

#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;#define ll long longll 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;}

还有这种写法

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;    }
0 0
原创粉丝点击