CF1338C Perfect Triples 题解
解题思路
没什么好说的,就是打表找规律……
不难发现,三元组中第一个数的最后两位按照
观察发现,当
综上,本题步骤为:
- 找到第
个数所在三元组的第一个数; - 令第一个数为
,我们将 转化为二进制,并将其位数补为偶数; - 根据
从最高位开始,每两位为一组,计算出对应的第 、 个数的这两位; - 将第
、 个数转化位十进制下整数; - 判断
并输出,若 ,输出第一个数,若 ,输出第二个数,否则输出第三个数。
AC 代码
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include <string.h>
#define int long long
#define N 100
int n,m;char a[N],b[N],c[N];
inline int GetStr(int x,char *s){
int ce=0;while(x){
s[++ce]='0'+(x&1);
x>>=1;
}return ce&1?ce+1:ce;
}
inline void GetNum(int &x,char *s,int len){
x=0;for(register int i=len;i>=1;--i)
x=(x<<1ll)+(s[i]-'0');
}
inline void work(){
scanf("%lld",&n);int lin;
for(register int i=60ll;i>=0ll;--i)
if((n>>i)&1ll){
m=i&1ll?i-1ll:i;
lin=m;break;
}
int sub=(1ll<<m),res=(n-sub)/3ll;
m=sub+res;int _1=m,_2,_3;
for(register int i=1;i<=80;++i)
a[i]='0';int ce=GetStr(m,a);
for(register int i=ce;i>=1;i-=2){
if(a[i]=='0'&&a[i-1]=='0'){
b[i]='0',b[i-1]='0';
c[i]='0',c[i-1]='0';
}else if(a[i]=='0'&&a[i-1]=='1'){
b[i]='1',b[i-1]='0';
c[i]='1',c[i-1]='1';
}else if(a[i]=='1'&&a[i-1]=='0'){
b[i]='1',b[i-1]='1';
c[i]='0',c[i-1]='1';
}else if(a[i]=='1'&&a[i-1]=='1'){
b[i]='0',b[i-1]='1';
c[i]='1',c[i-1]='0';
}
}GetNum(_2,b,ce),GetNum(_3,c,ce);
if(n%3==0) printf("%lld\n",_3);
else if(n%3==1) printf("%lld\n",_1);
else printf("%lld\n",_2);
}
signed main(){
int T;scanf("%lld",&T);
while(T--) work();
system("pause");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下