Codeforces Round #339 (Div. 2) (A 高精度)

来源:互联网 发布:济南直销软件 编辑:程序博客网 时间:2024/06/18 07:35

A. Link/Cut Tree
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifically, he is now studying the expose procedure.

Unfortunately, Rostislav is unable to understand the definition of this procedure, so he decided to ask programmer Serezha to help him. Serezha agreed to help if Rostislav solves a simple task (and if he doesn't, then why would he need Splay trees anyway?)

Given integers lr and k, you need to print all powers of number k within range from l to r inclusive. However, Rostislav doesn't want to spent time doing this, as he got interested in playing a network game called Agar with Gleb. Help him!

Input

The first line of the input contains three space-separated integers lr and k (1 ≤ l ≤ r ≤ 10182 ≤ k ≤ 109).

Output

Print all powers of number k, that lie within range from l to r in the increasing order. If there are no such numbers, print "-1" (without the quotes).

Sample test(s)
input
1 10 2
output
1 2 4 8 
input
2 4 5
output
-1
Note

Note to the first sample: numbers 20 = 121 = 222 = 423 = 8 lie within the specified range. The number 24 = 16 is greater then 10, thus it shouldn't be printed.



题意:给你一个区间[L,R],在给你一个K,问有哪些K的幂次方在这个区间内, 然后输出这些数字


题解:爆ULL,这是赛后用高精度模板过得,顺便说一句JAVA大法好,剩下来模拟一下就OK了




#include<string>#include<iostream>#include<iosfwd>#include<cmath>#include<cstring>#include<stdlib.h>#include<stdio.h>#include<cstring>#define MAX_L 205 //?????????????using namespace std;class bign{public:    int len, s[MAX_L];//??????????????//??????    bign();    bign(const char*);    bign(int);    bool sign;//??? 1???? 0????    string toStr() const;//??????????????????    friend istream& operator>>(istream &,bign &);//??????????    friend ostream& operator<<(ostream &,bign &);//?????????//???????    bign operator=(const char*);    bign operator=(int);    bign operator=(const string);//?????????    bool operator>(const bign &) const;    bool operator>=(const bign &) const;    bool operator<(const bign &) const;    bool operator<=(const bign &) const;    bool operator==(const bign &) const;    bool operator!=(const bign &) const;//????????????    bign operator+(const bign &) const;    bign operator++();    bign operator++(int);    bign operator+=(const bign&);    bign operator-(const bign &) const;    bign operator--();    bign operator--(int);    bign operator-=(const bign&);    bign operator*(const bign &)const;    bign operator*(const int num)const;    bign operator*=(const bign&);    bign operator/(const bign&)const;    bign operator/=(const bign&);//?????????????????    bign operator%(const bign&)const;//????????    bign factorial()const;//???    bign Sqrt()const;//????????????    bign pow(const bign&)const;//?��?//?��????????    void clean();    ~bign();};#define max(a,b) a>b ? a : b#define min(a,b) a<b ? a : bbign::bign(){    memset(s, 0, sizeof(s));    len = 1;    sign = 1;}bign::bign(const char *num){    *this = num;}bign::bign(int num){    *this = num;}string bign::toStr() const{    string res;    res = "";    for (int i = 0; i < len; i++)        res = (char)(s[i] + '0') + res;    if (res == "")        res = "0";    if (!sign&&res != "0")        res = "-" + res;    return res;}istream &operator>>(istream &in, bign &num){    string str;    in>>str;    num=str;    return in;}ostream &operator<<(ostream &out, bign &num){    out<<num.toStr();    return out;}bign bign::operator=(const char *num){    memset(s, 0, sizeof(s));    char a[MAX_L] = "";    if (num[0] != '-')        strcpy(a, num);    else        for (int i = 1; i < strlen(num); i++)            a[i - 1] = num[i];    sign = !(num[0] == '-');    len = strlen(a);    for (int i = 0; i < strlen(a); i++)        s[i] = a[len - i - 1] - 48;    return *this;}bign bign::operator=(int num){    if (num < 0)        sign = 0, num = -num;    else        sign = 1;    char temp[MAX_L];    sprintf(temp, "%d", num);    *this = temp;    return *this;}bign bign::operator=(const string num){    const char *tmp;    tmp = num.c_str();    *this = tmp;    return *this;}bool bign::operator<(const bign &num) const{    if (sign^num.sign)        return num.sign;    if (len != num.len)        return len < num.len;    for (int i = len - 1; i >= 0; i--)        if (s[i] != num.s[i])            return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i]));    return !sign;}bool bign::operator>(const bign&num)const{    return num < *this;}bool bign::operator<=(const bign&num)const{    return !(*this>num);}bool bign::operator>=(const bign&num)const{    return !(*this<num);}bool bign::operator!=(const bign&num)const{    return *this > num || *this < num;}bool bign::operator==(const bign&num)const{    return !(num != *this);}bign bign::operator+(const bign &num) const{    if (sign^num.sign)    {        bign tmp = sign ? num : *this;        tmp.sign = 1;        return sign ? *this - tmp : num - tmp;    }    bign result;    result.len = 0;    int temp = 0;    for (int i = 0; temp || i < (max(len, num.len)); i++)    {        int t = s[i] + num.s[i] + temp;        result.s[result.len++] = t % 10;        temp = t / 10;    }    result.sign = sign;    return result;}bign bign::operator++(){    *this = *this + 1;    return *this;}bign bign::operator++(int){    bign old = *this;    ++(*this);    return old;}bign bign::operator+=(const bign &num){    *this = *this + num;    return *this;}bign bign::operator-(const bign &num) const{    bign b=num,a=*this;    if (!num.sign && !sign)    {        b.sign=1;        a.sign=1;        return b-a;    }    if (!b.sign)    {        b.sign=1;        return a+b;    }    if (!a.sign)    {        a.sign=1;        b=bign(0)-(a+b);        return b;    }    if (a<b)    {        bign c=(b-a);        c.sign=false;        return c;    }    bign result;    result.len = 0;    for (int i = 0, g = 0; i < a.len; i++)    {        int x = a.s[i] - g;        if (i < b.len) x -= b.s[i];        if (x >= 0) g = 0;        else        {            g = 1;            x += 10;        }        result.s[result.len++] = x;    }    result.clean();    return result;}bign bign::operator * (const bign &num)const{    bign result;    result.len = len + num.len;    for (int i = 0; i < len; i++)        for (int j = 0; j < num.len; j++)            result.s[i + j] += s[i] * num.s[j];    for (int i = 0; i < result.len; i++)    {        result.s[i + 1] += result.s[i] / 10;        result.s[i] %= 10;    }    result.clean();    result.sign = !(sign^num.sign);    return result;}bign bign::operator*(const int num)const{    bign x = num;    bign z = *this;    return x*z;}bign bign::operator*=(const bign&num){    *this = *this * num;    return *this;}bign bign::operator /(const bign&num)const{    bign ans;    ans.len = len - num.len + 1;    if (ans.len < 0)    {        ans.len = 1;        return ans;    }    bign divisor = *this, divid = num;    divisor.sign = divid.sign = 1;    int k = ans.len - 1;    int j = len - 1;    while (k >= 0)    {        while (divisor.s[j] == 0) j--;        if (k > j) k = j;        char z[MAX_L];        memset(z, 0, sizeof(z));        for (int i = j; i >= k; i--)            z[j - i] = divisor.s[i] + '0';        bign dividend = z;        if (dividend < divid) { k--; continue; }        int key = 0;        while (divid*key <= dividend) key++;        key--;        ans.s[k] = key;        bign temp = divid*key;        for (int i = 0; i < k; i++)            temp = temp * 10;        divisor = divisor - temp;        k--;    }    ans.clean();    ans.sign = !(sign^num.sign);    return ans;}bign bign::operator/=(const bign&num){    *this = *this / num;    return *this;}bign bign::operator%(const bign& num)const{    bign a = *this, b = num;    a.sign = b.sign = 1;    bign result, temp = a / b*b;    result = a - temp;    result.sign = sign;    return result;}bign bign::pow(const bign& num)const{    bign result = 1;    for (bign i = 0; i < num; i++)        result = result*(*this);    return result;}bign bign::factorial()const{    bign result = 1;    for (bign i = 1; i <= *this; i++)        result *= i;    return result;}void bign::clean(){    if (len == 0) len++;    while (len > 1 && s[len - 1] == '\0')        len--;}bign bign::Sqrt()const{    if(*this<0)return -1;    if(*this<=1)return *this;    bign l=0,r=*this,mid;    while(r-l>1)    {        mid=(l+r)/2;        if(mid*mid>*this)            r=mid;        else             l=mid;    }    return l;}bign::~bign(){}int main(){#ifdef CDZSCfreopen("i.txt","r",stdin);#endifbign L,R,K;//std::ios::sync_with_stdio(false);cin>>L>>R>>K;bign tmp=K;int flag=1;if(L==1){flag=0;printf("1 ");}while(K<L){K*=tmp;}while(K<=R){flag=0;cout<<K<<" ";K*=tmp;}if(flag){puts("-1");}elseputs("");    return 0;}
















0 0