区间存在幂个数

Posted cancers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间存在幂个数相关的知识,希望对你有一定的参考价值。

题面

“给出 l, r, k,请从小到大输出所有在 [l, r] 范围内,能表示为 k 的非负整数次方的所有数。”
“多组数据。

,XXX 补充说,
“注意所有数的 0 次方都为 1,因此 1 也得算进去哦。”

输入

第一行一个数 T,表示数据组数。
接下来 T 行,每行 3 个数 l,r,k,表示一组数据。

输出

对于每一组数据输出一行(总共输出 T 行)。
如果存在符合要求的数,则在一行内从小到大输出这些数;否则输出一个字符串
"None."(包括句点,不包括引号)

样例

输入样例 1
4
1 10 2
2 4 5
19562 31702689720 17701
3680 37745933600 10
输出样例 1
1 2 4 8
None.
313325401
10000 100000 1000000 10000000 100000000 1000000000 10000000000

数据说明

对于所有数据,T ≤ 10000,l ≤ r,0≤ l,r,k < 2 63 。
子任务 1(20 分)
:r - l ≤ 1000。
子任务 2(30 分)
:l, r, k < 2 31 。
子任务 3(50 分)
:l, r, k < 2 63 。
这里的子任务表示的是数据类型,并不捆绑测试。
三个子任务中,各有 10 分的数据,满足 T = 10 且数据是随机的。
特别注意:本题中 0 的 0 次方也看做 1。

题解放代码里好叭。

代码

#include <cstdio>
#include <vector>
#define ll long long
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
inline ll read()
    ll x=0,f=1;char c=getchar();
    while (c>'9'||c<'0') if (c=='-') f=-1;c=getchar();
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48);c=getchar();
    return x*f;

ll l,r,k;
void work()
    l=read(),r=read(),k=read();
    vector <ll> v(0);//初始化
    if (k==0)//特判0 1的情况
        if (l<=0&&0<=r) v.push_back(0);
        if (l<=1&&1<=r) v.push_back(1);
    
    else if (k==1)
        if (l<=1&&1<=r) v.push_back(1);
    
    else
        for (ll i(1);;i*=k)
            if (l<=i&&i<=r) v.push_back(i);
            if (r/i<k) break;//i*k可能longlong溢出 所以加个特判
        
    
    if (v.empty()) puts("None.");
    else
        for (int i(0);i<v.size();++i) printf("%lld ",v[i]);
        puts("");
    


int main()
//  file("dynamic");
    ll t=read();
    while (t--) work();
    return 0;

//下文忽视
/*ll l,r,k,flag;
void init()
    l=read(),r=read(),k=read();


void doit()
    int flag=0;
    for (ll i(1);;i*=k)
        if (l<=i&&i<=r) flag=1,printf("%lld ",i);
        if (r/i<k) break;
    
    if (flag==0) printf("None.");
    puts("");


int main()
//  file("dynamic");
    ll t=read();
    while (t--)
        init();
        flag=0;
        if (k==0)
            if (l<=0&&0<=r) flag=1,printf("0 ");
            if (l<=1&&1<=r) flag=1,printf("1");
            if (!flag) printf("None.");
            puts("");
        
        else if (k==1)
            if (l<=1&&1<=r) flag=1,puts("1");
            if (!flag) printf("None.");
            puts("");
        
        else doit();
    
    return 0;

*/这是水逼做法,无优化无动脑细节

以上是关于区间存在幂个数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 457. 环形数组是否存在循环(快慢指针判环)/1137. 第 N 个泰波那契数(矩阵快速幂)

The Super Powers UVA - 11752

2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k

Codeforces 754D Fedor and coupons 优先队列

自然数幂和[第二类斯特林数求法]

二分?三分!