把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
		}
	}
}
posted @ 2020-08-18 15:58  275307894a  阅读(45)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end