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
1 10 2
1 2 4 8
2 4 5
-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;
}