zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",ans);
            }
            
        }
        return 0;
    }
    
    
  • 相关阅读:
    好题Islands
    DB2的安装
    MariaDB存在的问题
    MariaDB 脚本
    SQL 执行顺序
    Maria数据库
    3 ignite windows 上安装
    Cassandra 学习七 cassandra研究
    Cassandra学习六 一些知识点
    Cassandra学习五 使用Key的正确姿势
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12689947.html
Copyright © 2011-2022 走看看