fxtoi Wangshengjun33
题面传送门
我想没有人拿一棵树状数组去模拟的吧
树状数组模拟有\(40\)分
而只要你仔细观察就会发现,其实题目要你求一个式子:\(2^{\left\lfloor log^2(n)+1 \right\rfloor}-n\)
那么题目变成了\(log^2(n)\)怎么求
一个个除有\(60\)分,时间复杂度\(O(tlog^2n)\),在\(200ms\)中跑\(6.4\times10^8\)次,想想够呛
此题没有精确到小数,所以我们可以二分
这里二分指数,可以在\(O(tlog^2log^2n)\)的时间中跑完,算一算也就\(8\times10^7\)次,是可以跑过的
代码实现:
#include<cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
unsigned long long n,l,r,mid,t,a[139];
inline void read(unsigned long long &x) {
char s=getchar();x=0;
while(s<'0'||s>'9') s=getchar();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+(s^48),s=getchar();
}
inline void print(unsigned long long x){
if(x>9) print(x/10);
putchar(x%10+48);
}
int main() {
register int i;
//freopen("wsj10.in","r",stdin);
//freopen("wsj10.out","w",stdout);
a[0]=1;
for(i=1;i<=61;i++) a[i]=a[i-1]*2;
read(t);
while(t--) {
//scanf("%llu",&n);
read(n);
if((n&(-n))==n)printf("Fxt tai ruo 1e\n");
else {
l=1;
r=61;
while(l+1<r) {
mid=(l+r)>>1;
if(n<a[mid]) r=mid;
else l=mid;
}
/*print(a[r]-n);
putchar('\n');*/
printf("%llu\n",a[r]-n);
}
}
}

浙公网安备 33010602011771号