Codeforces Round #633(Div.2) E. Perfect Triples

//四进制下的表
//001 002 003
//1行  第一段 
//010 020 030
//011 022 033
//012 023 031
//013 021 032
//4行  第二段 
//100 200 300
//101 202 303
//102 203 301
//103 201 302
//110 220 330
//111 222 333
//112 223 331
//113 221 332
//120 230 330
//121
//……
//16行   第三段 
#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep_1(i,m,n) for(int i=m;i<=n;i++)
#define mem(st) memset(st,0,sizeof st)
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef pair<double,double> pdd;
const int inf = 0x3f3f3f3f;  
int main()
{
    ll t;
    cin>>t; 
    while(t--)
    {
    	//p-1是要特殊处理第一行
		//连续的段内,每个三元组的第一位是连续+1的
		//段的长度是4的次幂
		
		//然后第一行的三元组,是三个都连续+1的,1 2 3
		//p-1  是特殊处理第一行 
		
		//n是无限序列中的第几个
		
		//p代表行数 
        ll n;
        cin>>n;
		ll p=(n-1)/3,s=1,all=0;
        //找出当前位置的数字所在的段 
        while(p>=s)
        {
        	//减去每个段中的数字 
            p-=s;
            //每一段 中  的 行数 
			s<<=2;
        }
        //三元组的第一个 
        //每一段开头的第一个数 是 s ,p代表的是行数 
        //就直接加 
        if(n%3==1)   
			printf("%lld\n",s+p);
		//三元组的第二个 
		//也就是某一行的第二个 
		//对于某一行的三元组
		//对应位数 不是0 的 是 1 2 3循环的 
		//113 221 332
		// 
        else if(n%3==2)
        {
        	//
            ll ans=s<<1,c=1;
            while(p)
            {
            	//四进制的最低为 
                ll x=p%4;
                //如果是1 
                if(x==1)
					ans+=c*2;
                else if(x==2)
					ans+=c*3;
                else if(x==3)
					ans+=c;
                p>>=2,c<<=2;
            }
            printf("%lld\n",ans);
        }
        else
        {
            ll ans=s*3,c=1;
            while(p)
            {
                ll x=p%4;
                if(x==1)
					ans+=c*3;
                else if(x==2)
					ans+=c*1;
                else if(x==3)
					ans+=c*2;
                p>>=2,c<<=2;
            }
            printf("%lld\n",ans);
        }
        
    }
    return 0;
}

上一篇:CF R 633 div 1 1338 C. Perfect Triples 打表找规律


下一篇:leetcode279 Perfect Squares