ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1338C Perfect Triples

2021-09-30 18:34:13  阅读:178  来源: 互联网

标签:Perfect Triples 递归 ll long 四块 2n 取值 CF1338C


Lisa

这是个什么玩意

先打个表

然后发现a的取值似乎非常有规律

a的一些段落是连续的,然后这些连续的a对于每一块

a,b,c的值是从\(2^{2n-2}-2^{2n}-1\)

且对于b,如果我们把b在同一块里的值分成四部分的话,会发现首项大小是固定的,这四块的大小关系是固定的,这四块的取值范围是固定的,并且可以递归下去

c也可以

这样递归就可以了

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll t,n;
ll calc2(ll x,ll y){
	if(x==1) {
		return 1;
	}else {
		ll t=x/4;
		if(y<=t) {
			return calc2(t,y);
		}else if(y<=2*t) {
			return calc2(t,y-t)+2*t;
		} else{
			if(y<=3*t) {
				return calc2(t,y-2*t)+3*t; 
			}else {
				return calc2(t,y-3*t)+t; 
			} 
		}
	}
} 
ll calc3(ll x,ll y){
	if(x==1) {
		return 1;
	}else {
		ll t=x/4;
		if(y<=t) {
			return calc3(t,y);
		}else if(y<=2*t) {
			return calc3(t,y-t)+3*t;
		} else{
			if(y<=3*t) {
				return calc3(t,y-2*t)+t; 
			}else {
				return calc3(t,y-3*t)+2*t; 
			} 
		}
	}
} 
ll calc(ll n){
	ll tmp=n%3;
	n=(n+2)/3;
	ll pos=0;
	ll cnt=0;
	while(pos+(1ll<<cnt)<n){
		pos+=(1ll<<cnt);
		cnt+=2;
	}
	ll res=3*pos;
	if(tmp==1){
		return res+(n-pos);
	}else if(tmp==2){
		return res+(1ll<<cnt)+calc2(1ll<<cnt,n-pos); 
	}else{
		return res+(1ll<<(cnt+1))+calc3(1ll<<cnt,n-pos);
	}
	
}
int main(){
	scanf("%lld",&t);
	for(int i=1;i<=t;++i){
		scanf("%lld",&n);
		printf("%lld\n",calc(n));
	}
	return 0;
}

标签:Perfect,Triples,递归,ll,long,四块,2n,取值,CF1338C
来源: https://www.cnblogs.com/For-Miku/p/15357839.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有