专栏文章
题解:P8766 [蓝桥杯 2021 国 AB] 异或三角
P8766题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mipof706
- 此快照首次捕获于
- 2025/12/03 15:19 3 个月前
- 此快照最后确认于
- 2025/12/03 15:19 3 个月前
原题传送门
思路
我们先假设 ,由 我们可得 。又因 ,, 可构成三角形,所以 ,联系 ,所以 ,那么 和 在二进制下一定有一位都为 。所以我们运用状压的思想,将 , 以及 和 在二进制下一定有一位都为 化作三种状态判断即可。
代码
CPP#include<bits/stdc++.h>
#define int long long
#define inf 0x7f7f7f7f
#define mod 1000000007
using namespace std;
const int maxn = 1e6 + 100;
inline int read() {
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int T , dp[60][2][10] , a[60] , n , pos;
inline int dfs(int nows , int zt , bool flag) {
if(!nows) return zt == 7;
if(dp[nows][flag][zt] != -1) return dp[nows][flag][zt];
int maxx = flag ? a[nows] : 1 , tmp = 0;
if(maxx >= 0) tmp += dfs(nows - 1 , zt , (flag && a[nows] == 0));
if(maxx >= 0 && (zt & 1) && (zt >> 1 & 1)) tmp += dfs(nows - 1 , zt | 4 , (flag && a[nows] == 0));
if(maxx == 1) {
tmp += dfs(nows - 1 , zt | 2 , (flag && a[nows] == 1));
tmp += dfs(nows - 1 , zt | 1 , (flag && a[nows] == 1));
}
dp[nows][flag][zt] = tmp;
return tmp;
}
inline int work(int x) {
pos = 0;
while(x) {
a[++pos] = x & 1;
x >>= 1;
}
return dfs(pos , 0 , 1) * 3;
}
inline void solve() {
memset(dp , -1 , sizeof(dp));
n = read();
cout << work(n) << endl;
}
signed main(){
T = read();
while(T--) solve();
return 0;
}
注意事项:
这里的 数组一定要开三维,把当前位是否有限制加进去,不然会 T 飞。
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...