2019湖南省大学生程序设计竞赛题解(D)

这篇具有很好参考价值的文章主要介绍了2019湖南省大学生程序设计竞赛题解(D)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

D-Modulo Nine

很妙的类似区间dp, 我自己是想不到,本题解题思路来自学长的博客: 长沙橘子猫

题意

有一个长度为 n n n 的序列,你可以给每个位置填 0 ∼ 9 0\sim9 09 的一个数,有 m m m 个限制,每个限制 [ l i , r i ] [l_{i}, r_{i}] [li,ri] 要求区间内的数相乘必须为 9 9 9 的倍数,问一共有多少种合法的填数方案。

思路

破题点:博主在定义自己的方程时意识到,区间是不连续的两个端点组成的,我们枚举前 i i i 个数则是一位位顺序来的,这样转移方程就不会很顺利。
于是我们可以尝试往将区间也能随着我们顺序遍历来解决的方向虑,于是就引申出解法中,以右端点编号将所有右端点相同的区间的左端点存入同一个桶的做法。 (实际上我们只需要存最大左端点即可)

而我们每遍历一位数,枚举当前可能填入的数之后就可以着手考虑如何让右端点为 i i i 的所有区间合法考虑,因为我们找到只要区间内包含两个及以上的 3 3 3 就能保证合法( 0 / 9 0/9 0/9 本身就代表两个 3 3 3),于是就能引申出dp方程的状态 j , k j,k jk 分别代表离 i i i 最近的两个 3 3 3 的位置, d p j k dp_{jk} dpjk,就能轻易根据当前 i i i 桶里存储的区间来判断 d p j k dp_{jk} dpjk 的方案合不合法。文章来源地址https://www.toymoban.com/news/detail-413611.html

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 60, mod = 1e9 + 7;
int n, m;
ll f[N][N]; //前i个数 当前已经填过的数的最后一个3在j, 倒数第二个在i
vector<int>g[N];

void add(ll &x, ll y){
    x = (x + y + mod) % mod;
}

void solve(){

    for(int i = 0; i <= n; i ++){
        g[i].clear();
        for(int j = 0; j <= n; j ++) f[i][j] = 0;
    }
    
    for(int i = 1; i <= m; i ++){
        int l, r;
        cin >> l >> r;
        g[r].push_back(l); // 根据右端点存储左端点, 其实根据转移方程只需要记录最大的左端点即可,因为只要最大的左端点被满足,那么小一些的肯定也能被满足
    }


    f[0][0] = 1;
    for(int i = 1; i <= n; i ++){
        /* 计算所有可能结果 */
        for(int j = i - 1; ~j; j --){
            for(int k = j; ~k; k --){
                if(f[k][j] != -1){
                    add(f[i][i], f[k][j] * 2); // 0 / 9
                    add(f[j][i], f[k][j] * 2); // 3 / 6
                    f[k][j] = f[k][j] * 6 % mod; // 非3的倍数
                }
            }
        }

        /* 根据所给区间剔除不合法的解 */
        for(auto l : g[i]){ // 根据当前填数的点为右端点遍历所有的左端点, 那么对于所有区间l ~ i 中没有两个以上3的都视为不合法
            for(int j = 0; j < l; j ++){
                for(int k = j; k <= i; k ++){
                    f[j][k] = -1;
                }
            }
        }
    }

    ll ans = 0;
    for(int i = 0; i <= n; i ++){
        for(int j = 0; j <= i; j ++) {
           if(f[j][i] != -1) add(ans, f[j][i]);
        }
    }
    cout << ans << "\n";
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    while(cin >> n >> m){
        solve();
    }
    return 0;
}

到了这里,关于2019湖南省大学生程序设计竞赛题解(D)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023年“楚怡杯“湖南省职业院校技能竞赛“网络安全”竞赛 B模块 Windows渗透与Linux提权

    服务器场景:Server2003 服务器场景操作系统:Windows7 nmap没扫出来,得多扫几次,这里使用masscan直接快速扫描端口。 发现一个232的tcp端口,看看是不是telnet 确实是。 FLAG: 232 FLAG: hydra -l teltest -P /usr/share/wordlists/dirb/small.txt telnet://172.16.102.248 -s 232 本题有两种做法: 1.通过使用ms_

    2024年02月04日
    浏览(33)
  • 2022 年辽宁省大学生程序设计竞赛 个人题解

    title : 2022 年辽宁省大学生程序设计竞赛 date : 2022-10-25 tags : ACM,练习记录 author : Linno 题目链接:https://ac.nowcoder.com/acm/contest/43937 进度:10/13 质量比较差的场,后三题是错的,D题spj也是错的,其他nt题也多。 A-伟大奋斗 B-可莉的五子棋 枚举每个点作为起点向下统计就行了。 C-消

    2023年04月08日
    浏览(33)
  • 2023年四川大学生程序设计竞赛-K.倒转乾坤

    Cuber QQ 现在手上有两个圆环,其中小圆环的直径是 d,大圆环的直径是 2d 。他将小圆环放在大圆环内, 并让小圆环紧贴大圆环内壁进行无滑动的滚动。   Cuber QQ 总是喜欢动态的美,他在小圆环上等间隔地标记了 n 个点,他想知道在小圆环贴着大圆环运动一周后,他所

    2024年02月16日
    浏览(45)
  • 【超好懂的比赛题解】2021 年四川省大学生程序设计竞赛

    title : 2021 年四川省大学生程序设计竞赛 date : 2022-7-18 tags : ACM,练习记录 author : Linno 题目链接:https://codeforces.com/gym/103117 进度:11/13 切题顺序:AKMBDHLJ IF赛后补了,CG没看 A. Chuanpai 给定正整数 k,问有多少正整数对 (x, y) 满足 x + y = k 且 1 ≤ x ≤ y ≤ 6。 x 和 y 的可行范围很小,

    2024年02月05日
    浏览(27)
  • 大学生音乐社区微信小程序的设计与实现 毕业设计开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月05日
    浏览(33)
  • 大学生心理健康服务微信小程序系统的设计与实现

    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大学生心理健康服务微信小程序系统的开发全过程。通过分析大学生心理健康服务微信小程序系统管理的不足,创建了一个计算机管理大学生心理健康服务微信小程序系统

    2024年02月21日
    浏览(42)
  • 案例116:基于微信小程序的大学生就业平台设计与实现

    文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序运行软件:微信开发者 目录 目录 前言 系统展示 微信端功能模块的实现 微信端登录界面 首页界面 招聘详

    2024年01月21日
    浏览(40)
  • 2019年全国大学生电子设计大学(D 题)简易电路特性测试仪(2)基础部分电路与代码

    先看基础部分第一问,首先经过测试,我的共射放大电路的放大倍数是280左右(分立元件每个人都不一样),选择放大倍数越小的三极管越好做(1)中有作解释。 输入电阻 DDS输出的正弦波幅值为1.1v,经过分压后,串联一个电阻,根据公式计算即可得出。电路图如下:    

    2024年02月14日
    浏览(36)
  • HNUCM信息科学与工程学院第五届大学生程序设计竞赛——正式赛

    签到题 简单dp,取前面第五天的3倍就行 这题被封了不记得什么题了 枚举然后判断回文就行了 简单dp,不能跳的位置置0 算是一个简单思维题吧,先考虑偶奇依次排列,然后发现可能会剩下偶数或者奇数。 如果剩下的是偶数,因为偶数不会影响前面的奇偶性,所以在末尾首先

    2024年02月08日
    浏览(33)
  • 基于微信小程序的高校大学生社团管理系统设计与实现

    💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 👇🏻 精彩专栏 推荐订阅👇🏻 计算机毕业设计精品项目案例(持续更新) 🌟 文末获取源码+数据库+文档 🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项

    2024年01月25日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包