输出练习
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
为了练习输出,你需要从小到大输出 [l,r][l,r] 范围内能表示为 kk 的非负整数次方的所有数。一共有 TT 次练习。注意所有数的 00 次方都是 11,特别地,本题中认为 0^0=100=1。
输入描述:
第一行一个整数 TT。
接下来 TT 行,每行三个整数 l,r,kl,r,k 表示一次练习的参数。
1\leq T\leq 10^41≤T≤104,l\leq rl≤r,0\leq l,r,k<2^{63}0≤l,r,k<263。
输出描述:
共 TT 行,每行从小到大输出符合要求的数,若不存在,输出一行 None.(包括句点)。示例1
输入
复制4 1 10 2 2 4 5 19562 31702689720 17701 3680 37745933600 10
输出
复制1 2 4 8 None. 313325401 10000 100000 1000000 10000000 100000000 1000000000 10000000000
#include <bits/stdc++.h> #define fi first #define se second #define l(x) tree[x].l #define r(x) tree[x].r #define sum(x) tree[x].sum #define add(x) tree[x].add #define data(x) tree[x].data using namespace std; const int N=2e5+20; typedef long long LL; int t; LL l,r,k; int main() { scanf("%d",&t); while(t--) { scanf("%lld%lld%lld",&l,&r,&k); if(k==0) { if(l==0&&r>=1) puts("0 1"); else if(l==0&&r==0) puts("0"); else if(l==1&&r>=1) puts("1"); else puts("None."); } else if(k==1) {//会有一部分的超时 if(l<=1&&r>=1)puts("1"); else puts("None."); } else { if(l<=1&&r>=1) { LL res=1; printf("%lld ",res); while(res<=r/k)//先进行判断 注意相比较的方法 { res*=k; printf("%lld ",res); } cout<<endl; } else { LL maxx = (1ull<<63) - 1; bool x=0; LL res=1; while(res<l) { if (res > maxx / k) { maxx = 0; // cout<<"?"; break; } res*=k; } if (maxx == 0) { puts("None."); continue; } if (res <= r) { printf("%lld ",res); x=1; } while(res<=r/k) { res*=k; printf("%lld ",res); x=1; } if(x==0)printf("None."); puts(""); } } } return 0; }
主要是看这里的的解决方法:
LL maxx = (1ull<<63) - 1; if (res > maxx / k)标签:输出,puts,LL,tree,else,相乘,解决,define From: https://www.cnblogs.com/qianchangxiaozhushenyi/p/16859291.html
对于会爆LL的情况,采用有符号的大数值,采用除法进行判断,那么有符号的最大值可以通过无符号的(1ull<<63)-1得到的