Codeforces Round #339 (Div. 2) A. Link/Cut Tree - Codeforces(思维)

来源:互联网 发布:淘宝主播薇娅个人资料 编辑:程序博客网 时间:2024/05/23 01:26
Link/Cut Tree

Crawling in process...Crawling failedTime Limit:2000MS    Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

SubmitStatus

Description

Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifically, he is now studying theexpose 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 l, r and k, you need to print all powers of numberk within range from l to rinclusive. 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 l, r and k (1 ≤ l ≤ r ≤ 1018,2 ≤ k ≤ 109).

Output

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

Sample Input

Input
1 10 2
Output
1 2 4 8 
Input
2 4 5
Output
-1

题目大意:找到在l r之间的k的次数幂的数。这里还是比较坑的一道题,如果是k=10^9的时候数据是非常大的,而且多乘了一个10^9的时候,会导致溢出。所以我们这里处理数据的时候,首先我们要确定要用数据的定义为 long long int。然后记住,这里不能用pow函数,会把数据弄炸。

所以这里我们要应用一个小技巧,其解题主干为:

        ll tmp=1;        int flag=0;        while(tmp<=r)        {            if(tmp>=l&&tmp<=r)//如果在范围内有数据,说明不用输出-1;                printf("%I64d ",tmp),flag=1;            if(tmp>r/k)break;//如果tmp*k>r.说明没有必要再乘K了。然而这里tmp*k会溢出,所以挪到不等式右边,变成tmp>r/k的判断条件。            tmp*=k;        }
然后是完整的AC代码:

#include <cstdio>#include <cmath>#include <cstring>#include <iostream>using namespace std;#define ll long longll l,r,k;int main(){    while(~scanf("%I64d%I64d%I64d",&l,&r,&k))    {        ll tmp=1;        int flag=0;        while(tmp<=r)        {            if(tmp>=l&&tmp<=r)                printf("%I64d ",tmp),flag=1;            if(tmp>r/k)break;            tmp*=k;        }        if(flag)            printf("\n");        else            printf("-1\n");    }    return 0;}








0 0
原创粉丝点击