首页 > 其他分享 >AtCoder Beginner Contest 317 F - Nim

AtCoder Beginner Contest 317 F - Nim

时间:2023-08-28 18:11:49浏览次数:120  
标签:AtCoder Nim int 317 pos a1 lim2 bool dv

数位 DP

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int dp[64][10][10][10][2][2][2][2][2][2];

int main() {
  ll n; int b1, b2, b3; 
  cin >> n >> b1 >> b2 >> b3;
  memset(dp, -1, sizeof dp);
  string s; while (n) s.push_back(char('0' + (n & 1))), n /= 2;
  reverse(s.begin(), s.end());
  int m = s.size();
  function<int(int, int, int, int, bool, bool, bool, bool, bool, bool)> dfs = [&] (int pos, int a1, int a2, int a3, bool lim1, bool lim2, bool lim3, bool z1, bool z2, bool z3) -> int {
    if (pos == m) {
      return a1 == 0 and a2 == 0 and a3 == 0 and z1 and z2 and z3;
    }
    int &dv = dp[pos][a1][a2][a3][lim1][lim2][lim3][z1][z2][z3];
    //dv 表示枚举到 n 的第 pos 位, 此时 x1 % b1 = a1, x2 % b2 = a2, x3 % b3 = a3 并且 lim1, lim2, lim3 , 并且 x_i == 0 的真值为 z_i
    if (~dv) return dv; dv = 0;
    int up1 = (lim1 ? s[pos] - '0' : 1);
    int up2 = (lim2 ? s[pos] - '0' : 1);
    int up3 = (lim3 ? s[pos] - '0' : 1);
    for (int n1 = 0; n1 <= up1; n1 ++ ) {
      for (int n2 = 0; n2 <= up2; n2 ++ ) {
        int n3 = n1 ^ n2;
        if (n3 > up3) continue;
        dv += dfs(pos + 1, ((a1 << 1) + n1) % b1, ((a2 << 1) + n2) % b2, ((a3 << 1) + n3) % b3, lim1 and n1 == up1, lim2 and n2 == up2, lim3 and n3 == up3, z1 | n1, z2 | n2, z3 | n3);
        dv %= 998244353;
      }
    }
    return dv;
  };
  cout << dfs(0, 0, 0, 0, 1, 1, 1, 0, 0, 0);
	return 0;
}

标签:AtCoder,Nim,int,317,pos,a1,lim2,bool,dv
From: https://www.cnblogs.com/c972937/p/17663085.html

相关文章

  • ABC317F题解
    让人头大的数位DP。建议评蓝。个人认为不适合放ABC的F。将三个数二进制拆分,使三个数异或为0相当于每个二进制位三个数中有0或2个是1。所以考虑数位DP,设\(dp[i][m1][m2][m3][lim1][lim2][lim3]\)为第\(i\)位,三个数模\(a\),\(b\),\(c\)分别是\(m1\),\(m2\),\(m3\)......
  • [ABC317G] Rearranging 题解
    取自我的洛谷博客:https://www.luogu.com.cn/blog/SunnyYuan/solution-at-abc317-g借鉴了官方题解思路。思路首先我们要建立一个二分图。对于输入的\(a_{i,j}\),我们可以连接左侧的\(i\)和右侧的\(a_{i,j}\)。比如样例\(1\):注意:左边的\(1,2,3\)和右边的\(1,2......
  • AtCoder Beginner Contest 215
    [ABC215F]DistMax2 二分出min(|xi-xj|,|yi-yj|),双指针维护是否存在满足条件的点对(i,j),假如二分当前值是x,那么|xi-xj|>=x&&|yi-yj|>=x #include<bits/stdc++.h>usingnamespacestd;#defineendl"\n"typedeflonglongll;consti......
  • Adobe Animate2023版免激活下载及安装
    AdobeAnimate是非常好用的一款flash动画制作软件。是Adobe公司将FlashBuilder更名为AdobeAnimateCC的,加入对HTML5的支持,帮助开发人员创建更多Flash网站,广告和动画电影。经过20多年发展,AdobeFlashProfessional应用程序现在开始迈向HTML5新时代。几年前,Adobe将大部分Flash事业......
  • AtCoder Beginner Contest 314
    A-3.14#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(0),cin.tie(0);strings="141592653589793238462643383279502884197169399375105820974944592307816406286208998628034......
  • [论文理解] HACK: Learning a Parametric Head and Neck Model for High-fidelity Ani
    HACK:LearningaParametricHeadandNeckModelforHigh-fidelityAnimation上科大发布的头和脖子精细建模的参数化模型HACK。纹理转化由于HACK没有开源纹理基,我将FLAME开源的纹理基迁移到了HACK上,代码在这里开源:https://github.com/aoru45/FLAME_TO_HACK/tree/main论文......
  • AtCoder Beginner Contest 315
    A-tcdr#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){strings;cin>>s;for(autoi:s){if(i!='a'andi!='e'andi!='i'andi!='o'andi!='u�......
  • AtCoder Beginner Contest 287 - C (图论简单题)
    目录C-PathGraph?C-PathGraph?题意判断给定的无向简单图是不是一条链思路n个顶点m条边的无向图若为一条链,那么边数\(m=n-1\),n个顶点相互可达,任意一个顶点的度不超过2利用并查集判整体连通性,在建图时统计度数,最后判断即可由此,n个顶点,n-1条边的无向连通......
  • AtCoder Beginner Contest 315 - E (toposort)
    目录E-PrerequisitesE-Prerequisites题意n本书,序号1~n。给定阅读每本书之前必须要看的书的序号。请你输出任意一种看第一本书所需看书数量最少的方法思路利用拓扑序列先对书之间的制约关系建图,再利用bfs找到包含书本1的连通块,再对全图进行拓扑排序得到拓扑序列......
  • Atcoder Beginner Contest 315 D~G
    D题意:给定一个\(n\timesm\)的字符矩形,重复执行以下操作直到删除字符数为0:对于每一行,若有且仅有一种字符存在,且个数大于1,将这些字符标记对于每一列,若有且仅有一种字符存在,且个数大于1,将这些字符标记删除所有标记的字符求最后还能剩下多少字符。注意到每一行每一列最多被......