做之前没有想到AT的题还是有一定难度的,加油!
### ABC317
#### E - Avoid Eye Contact
随便bfs一下就好
#### F - Nim
考虑数位dp,用 $dp[x][r1][r2][r3][d1][d2][d3][z1][z2][z3]$ 记录位数,余数,最高位限制,前导0
用记忆化搜索实现
'''cpp
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const int P=998244353;
ll n,a,b,c,top,t[120],k1[110],k2[110],k3[110];
ll dp[120][11][11][11][2][2][2][2][2][2];
ll dfs(int x,int r1,int r2,int r3,int d1,int d2,int d3,int z1,int z2,int z3)
{
if(x==0) return !r1&&!r2&&!r3&&z1&&z2&&z3;
if(dp[x][r1][r2][r3][d1][d2][d3][z1][z2][z3]!=-1) return dp[x][r1][r2][r3][d1][d2][d3][z1][z2][z3];
int l1=d1?t[x]:1,l2=d2?t[x]:1,l3=d3?t[x]:1;ll ans=0;
if(l2==1&&l3==1) ans=(ans+dfs(x-1,r1,(r2+k2[x-1])%b,(r3+k3[x-1])%c,d1&&(0==l1),d2&&(1==l2),d3&&(1==l3),z1|0,z2|1,z3|1))%P;
if(l1==1&&l2==1) ans=(ans+dfs(x-1,(r1+k1[x-1])%a,(r2+k2[x-1])%b,r3,d1&&(1==l1),d2&&(1==l2),d3&&(0==l3),z1|1,z2|1,z3|0))%P;
if(l1==1&&l3==1) ans=(ans+dfs(x-1,(r1+k1[x-1])%a,r2,(r3+k3[x-1])%c,d1&&(1==l1),d2&&(0==l2),d3&&(1==l3),z1|1,z2|0,z3|1))%P;
ans=(ans+dfs(x-1,r1,r2,r3,d1&&(0==l1),d2&&(0==l2),d3&&(0==l3),z1|0,z2|0,z3|0))%P;
dp[x][r1][r2][r3][d1][d2][d3][z1][z2][z3]=ans;
return ans;
}
ll get(ll x){
while(x){
t[++top]=x%2;
x/=2;
}
return dfs(top,0,0,0,1,1,1,0,0,0);
}
int main()
{
memset(dp,-1,sizeof(dp));
cin>>n>>a>>b>>c;
k1[0]=1;k2[0]=1;k3[0]=1;
for(int i=1;i<=70;i++){
k1[i]=k1[i-1]*2%a;
k2[i]=k2[i-1]*2%b;
k3[i]=k3[i-1]*2%c;
}
cout<<get(n);
return 0;
}
'''