如题,不想写Dp于是推了个似乎是正确的贪心用数字模拟,结果爆了longlong。在及其迷惑的情况下我进行了如下操作:
#define int __int128
然后原来输出负号的点反馈出来了奇怪的东西:
没错原来错误的点变成了输出'+' ')' '/' '-'。
这是哪里出了问题……这题不会爆__int128吧?还是我对128的使用方法有什么误解。。。
附上我的代码。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define int __int128
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
inline void write(int x){
if(x>9)write(x/10);
putchar(x%10+'0');
}
namespace star
{
int a,b,c,aa,bb,zp,mx;
inline void work(){
int x=read();
zp=0;
while(x)a+=(x&1),x>>=1,zp++;
mx=max(mx,zp);zp=0;
x=read();
while(x)b+=(x&1),x>>=1,zp++;
mx=max(mx,zp);zp=0;
x=read();
while(x)c+=(x&1),x>>=1,zp++;
mx=max(mx,zp);zp=0;
if(a<b)swap(a,b);
if(a+b<c)return (void)puts("-1");
if(a+b==c){
int res=0;
for(int i=0;i<c;i++)res+=(1<<i);
write(res);
return ;
}
if(mx<max(a,max(b,c))+1)return (void)puts("-1");
if(c>a){
int zp=2*c-a-b,ans=0,i=0;
for(;i<zp;i++)ans+=(((__int128)1)<<i);
for(i++;i<c+1;i++)ans+=(((__int128)1)<<i);
write(ans);
return;
}
for(int i=0;i<a;i++)aa+=(((__int128)1)<<i);
for(int i=0;i<b;i++)bb+=(((__int128)1)<<i);
write(aa+(bb<<(c-b)));
}
}
signed main(){
star::work();
return 0;
}