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

Link/Cut Tree

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

Description

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 l, r and k, you need to print all powers of number k 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 from l 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 long
ll 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值