【校内模拟】【18-10-16】膜法 【组合数学】

2024-02-24 03:20

本文主要是介绍【校内模拟】【18-10-16】膜法 【组合数学】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(拖更N天终于想起来我还有博客
(校内模拟的题面&代码联赛后解除封印~)

题解

1.0 认(hu)真(luan)分析

一开始看这道题看了半天,还以为是什么区间查询之类的题,后来认认真真读了读样例,才理解过来——这是个组合数学题!

当且仅当存在至少一个环节,选择的书不同,或者在同一本魔法书上选取的咒语不一样。

这不就是组合数嘛……

分摊到每一步上,在 li 处有 li-k+1 种选择,在 li+1 处有 li+1-k+1 种选择……然后最后在 ri 处有 ri-k+1 种选择。

又因为l到r是连续的一段区间,所以每一步的方案数可以表示如下:
(借用于ZXY大佬的blog,%%%其实是我打不来

按照这个式子预处理一波阶乘和逆元,可以得到60分。

1.1正解

我们发现,刚才之所以拿不了满分,主要是在计算上花了很多时间。

那么我们可以把式子简化一些吗?

下面又是蒟蒻的我想不到的了

(再次借用于%%%神仙zxy的博客 )

我们要运用一些组合数学的定理:

在这里插入图片描述
​然后……
在这里插入图片描述

然后变成这样就非常方便了对吧?

这样一来,对于每一次个l和r,我们只需要计算两个值就可以求出这一段的方案总数,也就是O(1)的处理时间。预处理本身也只需要O(N)不到的复杂度。

于是,我们就开心的A掉这道题了~

总结:

组合数学一直是数论专题的重要考点之一,对于这方面的各种推论和运用,我们需要记住几个常用的定理和公式,一般就能保证自己做题时思路的正确性了。

还有重要的一点(就是我今天挂掉的主要问题 ),取模运算时一定要把除法转化为乘上逆元!要不然就算你的算法正确也照样GG了~

这篇关于【校内模拟】【18-10-16】膜法 【组合数学】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740797

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2