首页 > 其他分享 >「解题报告」CF1152F2 Neko Rules the Catniverse (Large Version)

「解题报告」CF1152F2 Neko Rules the Catniverse (Large Version)

时间:2023-06-01 10:04:13浏览次数:60  
标签:状态 continue 记录 Rules CF1152F2 int Version 连续 一段

发现有互不相等的限制,那就考虑一下连续段 DP。每次从小到大考虑每个数是否填,填的话填到哪里即可。

容易发现题目中的限制相当于要求每一个连续段的右边填的数不能与它差出 \(m\),且容易发现每个段的差的要求一定不相等,那么我们可以直接 \(2^m\) 状压记录每个连续段的差值要求。然后再记录一下是否已经确定了一段放在序列结尾即可。然后就是普通的连续段 DP 转移了。注意到我们这样就不需要记录连续段数量了,因为可以直接根据状态推出来。然后还得记录一下现在填了多少数,这样状态数是 \(O(k 2^{m+1})\) 的。需要注意的是我们合并的时候再确定每一段之间的位置关系,新建段的时候不考虑它的位置。(要不然还得记录最右面一段是啥,要不然没法转移)

\(n\) 很大,但是状态数不是很多,所以考虑直接矩阵快速幂优化。状态数其实还是有点多的,直接做不知道能不能跑过去。可以去掉一些无用状态,只要当前的状态不可能最后只剩下一段就直接不记录这个状态了。这样状态数有 \(367\) 个,可以跑。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 420, P = 1000000007;
int n, k, m;
int f[15][1 << 4][2];
int tot;
struct Matrix {
    int a[MAXN][MAXN];
    int* operator[](int b) { return a[b]; }
    const int* operator[](const int b) const { return a[b]; }
    Matrix() { memset(a, 0, sizeof a); }
    Matrix operator*(const Matrix &b) const {
        Matrix c;
        for (int k = 1; k <= tot; k++) {
            for (int i = 1; i <= tot; i++) {
                for (int j = 1; j <= tot; j++) {
                    c[i][j] = (c[i][j] + 1ll * a[i][k] * b[k][j]) % P;
                }
            }
        }
        return c;
    }
    Matrix pow(int b) {
        Matrix a = *this, ans;
        for (int i = 1; i <= tot; i++) ans[i][i] = 1;
        while (b) {
            if (b & 1) ans = ans * a;
            a = a * a;
            b >>= 1;
        }
        return ans;
    }
};
int main() {
    scanf("%d%d%d", &n, &k, &m);
    for (int i = 0; i <= k; i++) {
        for (int s = 0; s < (1 << m); s++) {
            for (int p = 0; p < 2; p++) if (i + __builtin_popcount(s) + p - 1 <= k) {
                f[i][s][p] = ++tot;
                // printf("f[%d][%d][%d] : %d\n", i, s, p, tot);
            }
        }
    }
    cerr << tot << endl;
    Matrix a;
    for (int i = 0; i <= k; i++) {
        for (int s = 0; s < (1 << m); s++) {
            for (int p = 0; p < 2; p++) if (i + __builtin_popcount(s) + p - 1 <= k) {
                int c = __builtin_popcount(s) + p;
                if (!(s >> (m - 1) & 1)) {
                    // do nothing
                    a[f[i][s][p]][f[i][s << 1][p]]++;
                    // new segment
                    a[f[i][s][p]][f[i + 1][s << 1 | 1][p]]++;
                    if (!p) a[f[i][s][p]][f[i + 1][s << 1][1]]++;
                    // append left
                    a[f[i][s][p]][f[i + 1][s << 1][p]] += c;
                }
                // append right
                for (int j = 0; j < m; j++) if (s >> j & 1) {
                    if (((s ^ (1 << j)) << 1) >> m & 1) continue;
                    a[f[i][s][p]][f[i + 1][(s ^ (1 << j)) << 1 | 1][p]]++;
                    if (!p) a[f[i][s][p]][f[i + 1][(s ^ (1 << j)) << 1][1]]++;
                }
                // merge two
                for (int x = 0; x < m; x++) if (s >> x & 1) {
                    if (((s ^ (1 << x)) << 1) >> m & 1) continue;
                    for (int y = 0; y < m; y++) if (x != y && (s >> y & 1)) {
                        a[f[i][s][p]][f[i + 1][(s ^ (1 << x)) << 1][p]]++;
                    }
                }
                if (p) {
                    for (int x = 0; x < m; x++) if (s >> x & 1) {
                        if (((s ^ (1 << x)) << 1) >> m & 1) continue;
                        a[f[i][s][p]][f[i + 1][(s ^ (1 << x)) << 1][p]]++;
                    }
                }

            }
        }
    }
    auto x = a.pow(n);
    printf("%d\n", x[f[0][0][0]][f[k][0][1]]);
    return 0;
}

标签:状态,continue,记录,Rules,CF1152F2,int,Version,连续,一段
From: https://www.cnblogs.com/apjifengc/p/17448091.html

相关文章

  • Spring:Formatter 和 ConversionService 的区别?
    在Spring框架中,Formatter和ConversionService是两个独立的概念,并没有直接的继承关系。Formatter接口和ConversionService接口是在不同的包中定义的,它们有着不同的目的和功能。Formatter接口位于org.springframework.format包中,用于格式化和解析字段值,并提供了本地化、格式化选项......
  • GitlabCI学习笔记之四:GitLabRunner pipeline语法之only except rules workflow
    1.only&except参考文档:https://docs.gitlab.com/ee/ci/yaml/#only--exceptonly和except是两个参数用分支策略来限制jobs构建,后面会逐步被rules替代only定义哪些分支和标签的git项目将会被job执行。except定义哪些分支和标签的git项目将不会被job执行示例job:#use......
  • How to use the shell command to get the version of Linux Distributions All In On
    HowtousetheshellcommandtogettheversionofLinuxDistributionsAllInOne如何使用shell命令获取Linux发行版的版本hostnamectlcat/etc/os-releaselsb_release-aLinuxDistributionsDebianUbuntuRaspberryPiOShttps://en.wikipedia.org/wiki/L......
  • ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found
    [root@localhostPaddleOCR]#strings/lib64/libstdc++.so.6|grep'CXXABI'CXXABI_1.3CXXABI_1.3.1CXXABI_1.3.2CXXABI_1.3.3CXXABI_1.3.4CXXABI_1.3.5CXXABI_1.3.6CXXABI_1.3.7CXXABI_TM_1[root@localhostPaddleOCR]#find/-name"libstdc++.......
  • flutter开发Nuget.exe not found, trying to download or use cached version解决方法
    问题:Nuget.exenotfound,tryingtodownloadorusecachedversion解决方法:首先确保VisualStudio安装,这个是flutter构建Window应用必须的,并且安装了对应的WindowsSDK,通过VisualStudioInstaller安装管理员身份运行cmd窗口,然后执行wingetinstallMicrosoft.NuGet安装NuG......
  • Visual AssistX Version 10.9.2491 Cracked
    任何问题请反馈至邮箱:[email protected](随缘查看邮件)Anyporbs->[email protected]再次声明:本破解补丁仅供交流学习和研究使用,不可用于商业。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。Notice:thispatcherisforcommunication,lear......
  • SAP UI5 compatible version 字段的作用和框架解析该值的位置
    在开发SAPUI5应用程序时,我们可以指定一个SAPUI5兼容版本(SAPUI5compatibleversion)字段。该字段用于确定应用程序所使用的SAPUI5版本,以确保应用程序与所选版本的框架兼容。SAPUI5兼容版本字段的作用是指定应用程序所依赖的SAPUI5版本。它定义了应用程序在运行时所使用的API和功能......
  • Wimlib-imagex 1.14.1和ImageX Tool for Windows Version: 10.0.10011.16384是两款不
    Wimlib-imagex1.14.1和ImageXToolforWindowsVersion:10.0.10011.16384是两款不同的Windows镜像工具,它们之间存在一些区别。开发者不同:Wimlib-imagex是由OpenSourceCommunity开发的自由开源软件,而ImageXToolforWindows是Microsoft开发的商业软件。编写语言不同:Wi......
  • ImageX Tool for Windows Version: 10.0.10011.16384
    D:\download\DISM\DISM>imagexImageXToolforWindowsCopyright(C)MicrosoftCorp.Allrightsreserved.Version:10.0.10011.16384IMAGEX[Flags]/Operation[ParameterList]Operation[APPEND|APPLY|CAPTURE|DELETE|DIR|E......
  • vue --version 显示的却是vue cli的版本号,为什么?
    vue--version显示的却是vuecli的版本号,为什么?如果您在运行vue--version命令时显示的是VueCLI的版本号,而不是Vue.js的版本号,那可能是因为您已经全局安装了VueCLI。VueCLI是一个用于快速搭建Vue.js项目的脚手架工具,它依赖于Vue.js并提供了许多额外的功能和工具......