USACO 2021 Feb T3 Count the Cows G
green_orange · · 题解
USACO 2021 Feb T3 Count the Cows G
分析
首先转化题意,分析题中所给出的
对于向下取整,我们所拥有的技巧相对较少,我们不妨将其写成如下形式:
其中
接下来分析
我们观察到对于不同的
题目中的关系可转化为
我们发掘出了对于单一的
展开上式
我们发现有大量
题目所给关系转化为
根据我们的经验,我们发现上式中的形式就是
这个结论对我们来说大有脾益,那么,我们就是求有多少的
实现
#include <bits/stdc++.h>
using namespace std;
const static int mlg = 40;
#define int long long
int f[mlg][2][2][2];
bool vis[mlg][2][2][2];
int Ab[mlg], Bb[mlg], lb[mlg];
bool check(int a, int b) {
if (a < 0 || b < 0 || a > 2 || b > 2)
return false;
else if ((a & 1) == (b & 1))
return true;
else
return false;
}
typedef long long inte;
inline int dfs(int p/*第几位*/, bool a/*x 是否进位*/, bool b/*y 是否进位*/, bool lim/*d 是否被顶满*/) {
if (p < 0)
return (a == 0) && (b == 0);
if (vis[p][a][b][lim])
return f[p][a][b][lim];
vis[p][a][b][lim] = true;
inte ans = 0;
for (int v = 0; v <= (lim ? lb[p] : 2); ++v) {
for (int ak = 0; ak <= 1; ++ak) {
for (int bk = 0; bk <= 1; ++bk) {
if (check(Ab[p] - 3 * a + v + ak, Bb[p] - 3 * b + v + bk)) {
ans += dfs(p - 1, ak, bk, lim & (v == lb[p]));
}
}
}
}
return f[p][a][b][lim] = ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int Q;
cin >> Q;
while (Q--) {
inte x, y, d;
cin >> d >> x >> y;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < mlg; ++i) {
Ab[i] = x % 3;
x /= 3;
Bb[i] = y % 3;
y /= 3;
lb[i] = d % 3;
d /= 3;
}
cout << dfs(mlg - 1, 0, 0, true) << endl;
}
return 0;
}