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…

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

蓝桥杯 每日2题 day5

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

【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…

【ctf.show】获得百分之百的快乐

1.打开靶场 2.根据页面代码&#xff0c;get请求值只能小于4位数&#xff0c;否则会回显hack&#xff01; 尝试后确实是这样的&#xff1a; 请求值小于4位数&#xff0c;页面无变化&#xff1a; 发送请求值ls查看内容 3.根据2返回的值&#xff0c;发送值为?1>nl 创建一个nl…

vivado 使用基本触发器模式

使用基本触发器模式 基本触发器模式用于描述触发条件 &#xff0c; 即由参与其中的调试探针比较器组成的全局布尔公式。当“触发器模式 (Trigger Mode) ”设置为 BASIC_ONLY 或 BASIC_OR_TRIG_IN 时 &#xff0c; 即启用基本触发器模式。使用“基本触发器设置 (Basic Trig…

【面试题】细说mysql中的各种锁

前言 作为一名IT从业人员&#xff0c;无论你是开发&#xff0c;测试还是运维&#xff0c;在面试的过程中&#xff0c;我们经常会被数据库&#xff0c;数据库中最经常被问到就是MySql。当面试官问MySql的时候经常会问道一个问题&#xff0c;”MySQL中有哪些锁&#xff1f;“当我…

数据结构-----Lambda表达式

文章目录 1 背景1.1 Lambda表达式的语法1.2 函数式接口 2 Lambda表达式的基本使用2.1 语法精简 3 变量捕获3.1 匿名内部类3.2 匿名内部类的变量捕获3.3 Lambda的变量捕获 4 Lambda在集合当中的使用4.1 Collection接口4.2 List接口4.3 Map接口 HashMap 的 forEach() 5 总结 1 背…

第十三届蓝桥杯真题:x进制减法,数组切分,gcd,青蛙过河

目录 x进制减法 数组切分 gcd 青蛙过河 x进制减法 其实就是一道观察规律的题。你发现如果a这个位置上的数x&#xff0c;b这个位置上的数是y&#xff0c;那么此位置至少是max(x,y)1进制。一定要把位置找对啊 #include <bits/stdc.h> using namespace std; typedef l…