lucas定理+数位dp+组合数学,蓝桥杯真题[组合数问题]

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

1.组合数问题 - 蓝桥云课 (lanqiao.cn)


二、解题报告

1、思路分析

lucas => 分解为k进制数 =>
一堆只包含若干小于k的数相乘的组合数相乘 mod k 为 0 =>
某个组合数或某些组合数 下 < 上 =>
求 0 <= i <= n 0 <= j <= m ,i的k进制中至少有一位小于j的k进制的(i,j)个数 =>
数位dp + 差分 => 
tot - i的k进制中每一位都大于等于j的k进制的每一位(i,j)个数
f[i][j]剩余i位,前缀状态为j的满足条件的数字数目

朴素数位dp O(k)状态转移,会TLE
改进为O(1)状态转移:根据可转移状态能得到能填数字的范围,计算出该范围内的数位对,乘法原理优化状态转移

f(n, pre)
前缀状态:

0 都未匹配
1 i和n前缀匹配
2 j和m前缀匹配
3 i和n前缀匹配 且 j和m前缀匹配

cnt0(x, y):计算i in [0, x] j in [0, y]的符合条件(i, j)数目
cnt1(x, y) = min(x, y) + 1
cnt2(x, y) = x - y + 1
cnt3(x, y) = x >= y (bool)

状态转移:
f(n, 0) = f(n - 1, 0) * cnt0(k - 1, k - 1)

f(n, 1) = f(n - 1, 0) * cnt0(dn[n] - 1, k - 1) + 
          f(n - 1, 1) * cnt1(dn[n], k - 1)

f(n, 2) = f(n - 1, 0) * cnt0(k - 1, dm[n] - 1) + 
          f(n - 1, 2) * cnt2(k - 1, dm[n])

f(n, 3) = f(n - 1, 0) * cnt0(dn[n] - 1, dm[n] - 1) + 
          f(n - 1, 1) * cnt1(dn[n], dm[n] - 1) +
          f(n - 1, 2) * cnt2(dn[n] - 1, dm[n]) + 
          f(n - 1, 3) * cnt3(dn[n], dm[n])
 

这道题有个很玄学的地方就是cnt0中x和y的取模如果放在第二if和第一个if之间就会WA6个点,但是if内写一个,if外写一个就不会,到底是什么原因呢?

2、复杂度

时间复杂度: O(log_{k}^{n} * 4)空间复杂度:O(log_{k}^{n} * 4)

3、代码详解

#include <iostream>
#include <cstring>
#define int long long
using namespace std;
const int N = 65, mod = 1e9 + 7, inv2 = 500000004;
int f[N][4]; 
int k, dn[N], dm[N], lenn, lenm;
int cnt0(int x, int y)
{ if (x < 0 || y < 0)return 0;if (x < y){x %= mod, y %= mod;return (x + 2) * (x + 1) % mod * inv2 % mod;}x %= mod, y %= mod;return ((y + 2) * (y + 1) % mod * inv2 % mod + (x - y) * (y + 1) % mod) % mod;
}
inline int cnt1(int x, int y){return (min(x, y) + 1) % mod;
}
inline int cnt2(int x, int y){if(x < y) return 0;return (x - y + 1) % mod;
}
inline int cnt3(int x, int y){return x >= y;
}int dfs(int n, int pre){if(!n) return 1;if(~f[n][pre]) return f[n][pre];int& res = f[n][pre] = 0;if(!pre)res = dfs(n - 1, 0) * cnt0(k - 1, k - 1) % mod;if(pre == 1)res = (dfs(n - 1, 0) * cnt0(dn[n] - 1, k - 1) % mod + dfs(n - 1, 1) * cnt1(dn[n], k - 1) % mod) % mod;if(pre == 2)res = (dfs(n - 1, 0) * cnt0(k - 1, dm[n] - 1) % mod + dfs(n - 1, 2) * cnt2(k - 1, dm[n]) % mod) % mod;if(pre == 3)res = (dfs(n - 1, 0) * cnt0(dn[n] - 1, dm[n] - 1) % mod + dfs(n - 1, 1) * cnt1(dn[n], dm[n] - 1) % mod +dfs(n - 1, 2) * cnt2(dn[n] - 1, dm[n]) % mod + dfs(n - 1, 3) * cnt3(dn[n], dm[n]) % mod) % mod;return res %= mod;
}signed main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _ = 1;cin >> _ >> k;while(_--){memset(f, -1, sizeof f);memset(dn, 0, sizeof dn), memset(dm, 0, sizeof dm);int n, m;cin >> n >> m;m = min(n, m);int tot = cnt0(n, m);lenn = lenm = 0;while(n) dn[++lenn] = n % k, n /= k;while(m) dm[++lenm] = m % k, m /= k;cout << ((tot - dfs(lenn, 3)) % mod + mod) % mod << '\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis怪谈

缓存穿透、击穿、雪崩 《缓存三兄弟》 穿透无中生有key&#xff0c;布隆过滤null隔离 缓存击穿过期key&#xff0c;锁与非期解难题 雪崩大量过期key&#xff0c;过期时间要随机 面试必考三 兄 弟&#xff0c;可用限流来保底 什么是缓存穿透 指查询一个一定不存在的数据&#x…

部署Redis

部署Redis过程简要记录 在家目录创建存放各类软件源码、安装文件、数据、日志、依赖等目录 cd /home/liqiang mkdir sourcecode software app log data lib tmp在 sourcecode 中下载Redis并解压 cd sourcecode wget http://download.redis.io/releases/redis-5.0.4.tar.gz t…

1. Django建站基础

1. Django建站基础 学习开发网站必须了解网站的组成部分, 网站类型, 运行原理和开发流程. 使用Django开发网站必须掌握Django的基本操作, 比如创建项目, 使用Django的操作指令以及开发过程中的调试方法.1.1 网站的定义及组成 网站(Website)是指在因特网上根据一定的规则, 使用…

C++ primer 第十八章

C语言的三大特性&#xff1a;异常处理、命名空间、多重继承。 1.异常处理 异常处理机制允许我们能够将问题的检测与解决过程分离开来。 1.1、抛出异常 在C语言中&#xff0c;我们通过抛出一条表达式来引发一个异常。 当执行一个throw时&#xff0c;程序的控制权从throw转移…

谷歌不收录怎么办?

谷歌不收录首先你要确认自己网站有没有出问题&#xff0c;比如你的网站是否已经公开&#xff0c;rboot是否允许搜索引擎进来&#xff0c;网站架构有没有问题&#xff0c;面包屑的结构是否有问题&#xff0c;确保你的网站没问题 接下来就是优化这个过程&#xff0c;有内容&#…

IPSec简介

起源 随着Internet的发展&#xff0c;越来越多的企业直接通过Internet进行互联&#xff0c;但由于IP协议未考虑安全性&#xff0c;而且Internet上有大量的不可靠用户和网络设备&#xff0c;所以用户业务数据要穿越这些未知网络&#xff0c;根本无法保证数据的安全性&#xff0…

path环境变量的作用

当我把一个运行文件的路径加入到了path环境变量&#xff0c;就可以在cmd命令行随时使用运行。 在path中有两个path上面的是用户的path&#xff0c;下面的是计算机的path

算法竞赛总结(C++) 持续更新中

一、基础算法 排序 快速排序 &#xff08;不常用&#xff09;归并排序 求逆序对 二分 前缀和 一维 二维 差分 一维二维 双指针 离散化 区间合并 位运算&#xff08;lowbit(x)&#xff09; 高精度 ABA-BA*B &#xff08;高精度整数A乘低精度整数b&#xff09;A/B &am…

蓝桥杯 每日2题 day5

碎碎念&#xff1a;哦哈呦&#xff0c;到第二天也是哦哈哟&#xff0c;&#xff0c;学前缀和差分学了半天&#xff01;day6堂堂连载&#xff01; 0.单词分析 14.单词分析 - 蓝桥云课 (lanqiao.cn) 关于这题就差在input前加一个sorted&#xff0c;记录一下下。接下来就是用字…

【Python】浅谈python中的json

前言 最近一直在做开发相关的工作--基于Django的web 平台&#xff0c;其中需要从model层传输数据到view 层做数据展示或者做业务逻辑处理。我们采用通用的Json格式--Json(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于阅读和程序解析。 认识Jso…

【MATLAB源码-第10期】基于matlab的pi/4DQPSK,π/4DQPSK的误码率BER理论和实际对比仿真。

1、算法描述 蓝牙是一种被广泛应用的无线通信标准&#xff0c;工作在2.4GHz-2.4835GHz频段范围&#xff0c;所用的调制方式有:GFSK&#xff0c;PI/4-DQPSK。北美第二代数字蜂窝移动通信系统D-AMPS和日本的JDC蜂窝系统均采用PI /4-DQPSK&#xff0c;欧洲的GSM系统采用GMSK。PI /…

水质溶解氧控制器的优势特点

在全球水资源日益紧缺、水质问题愈发严重的现状下&#xff0c;如何科学有效地监测与管理水体溶解氧含量&#xff0c;成为了关乎生态环境保护、水生生物生存以及人类饮水安全的重要课题。溶解氧作为衡量水体自净能力、判断水体是否缺氧、评估水生生态系统健康状况的一项关键指标…

类和对象【一】类和对象简介

文章目录 C的类与C语言结构体的区别【引入类】类的定义类体中的成员函数的实现类中的访问限定符C中class和struct的区别 类的作用域类的实例化类中成员的存储位置类的大小 C的类与C语言结构体的区别【引入类】 类里面不仅可以定义变量还可以定义函数 例 类具有封装性【将在该…

关于nvm node.js的按照

说明&#xff1a;部分但不全面的记录 因为过程中没有截图&#xff0c;仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2&#xff0c;了解后 发现是nvm使用的版本较低&#xff0c;于是涉及nvm卸载 重新下载最新版本的nvm 2…

云原生数据库海山(He3DB)PostgreSQL版核心设计理念

本期深入解析云原生数据库海山PostgreSQL版&#xff08;以下简称“He3DB”&#xff09;的设计理念&#xff0c;探讨在设计云原生数据库过程中遇到的工程挑战&#xff0c;并展示He3DB如何有效地解决这些问题。 He3DB是移动云受到 Amazon Aurora 论文启发而独立自主设计的云原生数…

Excel---一个工作簿中的多个sheet合并成一个PDF

0 Preface/Foreword 1 操作方法 1.1 方法一 文件》 导出 》创建PDF/XPS 》 选项 》发布内容 》“整个工作簿” 1.2 方法二 文件》 打印》 打印机选项中&#xff0c;选择一种PDF阅读器 》设置选项中&#xff0c;选择打印整个工作簿。

三步就能在OpenHarmony中实现车牌识别

介绍 本车牌识别项目是基于开源项目 EasyPR&#xff08;Easy to do Plate Recognition&#xff09;实现。EasyPR 是一个开源的中文车牌识别系统&#xff0c;基于 OpenCV 开源库开发。 本项目使用润和 HiSpark Taurus AI Camera(Hi3516DV300) 摄像头开发板套件(以下简称 Hi351…

对拍器/对数器 赛前抱佛脚

“对拍器/对数器的使用前提是该题你会暴力解法&#xff0c;如果不会&#xff0c;那么对拍器/对数器也没啥用。” 对拍器/对数器 应用背景 你有一个绝对对的暴力cpp代码&#xff0c;但时间会T&#xff0c;只适用于小范围的数据。所以你写了一个聪明的非暴力cpp代码&#xff0c…

设计模式: 行为型之中状态模式(20)

状态模式概述 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为状态模式通过为每个状态定义一个类&#xff0c;使得对象在其内部状态改变时&#xff0c;可以改变其行为 状态模式应用 // 定义状态接口 int…

小红书2020校招算法笔试题卷一 编程题no.3 击败魔物

题目 击败魔物 薯队长来到了迷宫的尽头&#xff0c;面前出现了N只魔物&#xff0c;Hi表示第i只魔物的血量&#xff0c;薯队长需要在T个回合内击败所有魔物才能获胜。每个回合薯队长可 以选择物理攻击一只魔物&#xff0c;对其造成1点伤害&#xff08;物理攻击次数无上限&#x…