Codeforces 559C Gerald and Giant Chess(DP+乘法逆元求大组合数)

快速入门之——乘法逆元求组合数 逆元+快速幂+阶乘求组合数(快速入门) 文章目录逆元+快速幂+阶乘求组合数(快速入门)前言:何为逆元?怎么求逆元?怎么求阶乘逆元?相关代码实现: 前言: 大家基本上应该都知道用杨辉三角法求组合数C(n,m)(n为下标) 也就是直接暴力打表求法O(n*m): for(int i=0;i<=n;i++){ c[i][0]=c[i][i]=1; for(int j=1;j<i;j++) ... 阅读详情
先把黑块按坐标排序。
dp[i]表示到第i个黑块且之前没有经过黑块的方案数,那么每一个dp[i]中的方案都是完全不相同的。递推的方法是dp[i]=C(xi+yi,xi)-sum(dp[j]*C(xi-xj+yi-yj,xi-xj))  (j<i)
dp[j]*C(xi-xj+yi-yj,xi-xj)就是从1,1经过第j个黑块到i的路径数,用总路径数减去所有的这些不合法的路径数就是dp[i],(剪去的路径中没有重复的)。


由于组合数太大,需要用乘法逆元预处理出每个阶乘的逆元。模板在下面。
pair的默认排序规则就是先按key再按value从小到大。


注意预处理阶乘要到2*100000


代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <map>
#include <algorithm>
#define LL long long
const int mod=1e9+7;
#include <vector>
LL fact[200200];
LL ifact[200200];
int h,w,n;
LL dp[2005];
pair<int,int> G[2005];


LL ex(LL a,LL e)
{
    if(e==0) return 1;
    LL res=ex(a,e/2);
    res*=res;
    res%=mod;
    if(e%2==1) res*=a;
    res%=mod;
    return res;
}


LL inv(LL a)
{
    return ex(a,mod-2);
}


LL C(int h,int w)
{
    if(h<0||w<0) return 0;
    LL res=fact[h+w];
    res*=ifact[h];
    res%=mod;
    res*=ifact[w];
    res%=mod;
    return res;
}
void init(){
    fact[0]=1;
    ifact[0]=1;
    for(int i=1; i<200005; i++)
    {
        fact[i]=fact[i-1]*i;
        fact[i]%=mod;
        ifact[i]=inv(fact[i]);
    }
}




int main(){
    scanf("%d%d%d",&h,&w,&n);
    init();
    for(int i=0;i<n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        G[i]=make_pair(x,y);
    }
    sort(G,G+n);
    G[n]=make_pair(h,w);
    for(int i=0;i<=n;i++){
        int x=G[i].first-1,y=G[i].second-1;
        dp[i]=C(x,y);
        for(int j=0;j<i;j++){
            int xx=G[i].first-G[j].first;
            int yy=G[i].second-G[j].second;
            LL tmp=C(xx,yy)*dp[j];
            tmp%=mod;
            dp[i]-=tmp;
            while(dp[i]<0) dp[i]+=mod;
        }
    }
    printf("%lld\n",dp[n]);
}

组合数计算方法(递推公式、乘法逆元) 组合数的公式定义:C(n,m) = n!),从n个里边选m个。 阅读详情

相关推荐

【CodeForces】559C Gerald and Giant Chess 国际象棋 解题思路(Java)

参考了: [1].乘法逆元详解【费马小定理+扩展欧几里得算法】 [2].逆元的三种求法 (费马小定理,扩展欧几里得,递推求阶乘逆元) [3].【Codeforces Round #313 (Div. 1) C】 CodeForces 559C Gerald and Giant Chess 不得不说,这道题很难。 要掌握的知识点: 第一部分:得到dp状态转移方程 1.排列组合,从一个开始到达结束,...

qq_28799479的博客 474

乘法逆元及其组合数运算

同余式: 设m是给定的一个正整数,a、b是整数,若满足m|(a-b),则称a与b对模m同余,记为a≡b(mod m),或记为a≡b(m)。这个式子称为模m的同余式。 a≡b(mod m) 等价于 a,b分别除以m,得到的余数相同。 乘法逆元 概念:如果ax ≡ b (mod p) ,且gcd(a, p) = 1(a, p互质,是逆元存在的充要条件), 则称a 的逆元为 x。 逆元的含义:在模以p...

D.k的博客 1133

告别SD卡!手把手教你用NVMe硬盘盒给Jetson Orin Nano离线烧录Ubuntu系统

本文详细介绍了如何利用NVMe硬盘盒为Jetson Orin Nano离线烧录Ubuntu系统,替代传统SD卡方案。通过硬件选择、系统镜像准备到烧录命令的全流程解析,帮助开发者提升存储性能与系统稳定性,特别适合嵌入式开发场景。

weixin_30808693的博客 459

组合数计算(逆元、递推、卢卡斯、高精度)

文章目录一、定义·乘法逆元·取模1.分析2.代码二、递推·杨辉三角·取模1.分析2.代码三、公式·卢卡斯定理·取模1.分析2.代码四、定义·高精度·不取模1.分析2.代码 一、定义·乘法逆元·取模 1.分析 计算CnmC^m_nCnm​对p取模的结果,根据定义我们的计算公式为n!m!(n−m)!\frac{n!}{{m!}{(}{n-m}{}{)}{!}}m!(n−m)!n!​,此时我们还需要对结果取模,我们对除法无法直接进行取模操作,所以我们此时需要对分子使用乘法逆元。 乘法逆元 简要说来,求逆元的.

qq_52441682的博客 1445

自由曲面与衍射光学元件DOE:从基础理论到工业应用的全景解析

本文全景解析了自由曲面与衍射光学元件的核心理论与工业应用。文章深入探讨了自由曲面在非对称光学设计中的灵活性及其数学描述与制造挑战,并阐述了衍射光学元件通过微纳结构进行波前相位调制的原理与多样化功能。两者与经典光学互补融合,共同构成了高端成像、智能照明、激光加工及AR/VR等前沿领域的底层技术支柱。

devops8pract的博客 392

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图)

本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。

weixin_28731223的博客 462

数论——乘法逆元求组合数

上次学过一个杨辉三角求组合数也就是暴力打表O(n2)O(n^2)O(n2)的复杂度导致很多情况下都会TLE 于是想到用阶乘(因为有快速幂嘛) 但是很多情况下还是会有对一个mod求余 但是公式中有除法(n!(m−n)!m!\frac{n!}{(m-n)!m!}(m−n)!m!n!​) 我们知道(a / b) % p != (a % p) / (b % p) 除非 a∗b−1a * b^{-1}a∗b−1 % p = a % p * b−1b^{-1}b−1 % p 那么问题来到该怎么求阶乘的倒数呢? 这就有了

lymww的博客 886

避开命令行!在VMware vCenter 8.0图形化界面里搞定SSL证书续期全流程

本文详细介绍了在VMware vCenter 8.0图形化界面中完成SSL证书续期的全流程,包括计算机SSL证书、VMCA根证书和STS证书的管理。通过可视化操作,管理员无需使用命令行即可高效处理证书问题,确保vSphere环境的稳定运行。文章还提供了证书监控与预警配置的实用技巧,帮助用户提前规避证书过期风险。

weixin_27051161的博客 284

Codeforces 559 C Gerald and Giant Chess题解(计数DP)

题目:CF559C. 题目大意:给定一张n∗mn*mn∗m的网格,要求从(1,1)(1,1)(1,1)走到(n,m)(n,m)(n,m),每次只能往下走一格或往右走一格.现在有kkk个障碍点(xi,yi)(x_i,y_i)(xi​,yi​),求不经过障碍点的方案数. 1≤n,m≤105,1≤k≤20001\leq n,m\leq 10^5,1\leq k\leq 20001≤n,m≤105,1≤k...

hzk_cpp的博客 280

手把手教你用示波器实测LVDS/CML信号:从波形解读到故障排查(附实测图)

本文详细介绍了如何使用示波器实测LVDS和CML信号,从波形解读到故障排查的全过程。涵盖差分探头选择、示波器配置、标准波形特征解读、眼图分析技巧以及高速信号捕获要点,帮助硬件工程师快速诊断和解决信号完整性问题。附实测图和案例,提升高速数字电路设计效率。

weixin_27215337的博客 200

SAP ABAP ALV表格实战:5分钟搞定单元格下拉框配置(附完整代码)

本文详细介绍了在SAP ABAP开发中如何快速配置ALV表格的单元格下拉框功能,通过5分钟实战教程帮助开发者掌握关键步骤。文章包含完整的ABAP代码示例,涵盖下拉值定义、字段目录配置及ALV控件绑定等核心操作,特别适合需要实现财务系统费用类型选择或采购系统物料分类等场景的开发者参考。

weixin_28331555的博客 112

【Codeforces Round #313 (Div. 1) C】 CodeForces 559C Gerald and Giant Chess

计数类dp+乘法逆元

YHaX的博客 450

大模型在电力交易功率预测中的应用:短期,超短期,中长期的完整解决方案代码详解

本文介绍了基于大模型的电力交易功率预测系统,该系统覆盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1月)三个时间尺度。文章详细阐述了数据准备与特征工程,包括多源数据集成和特征重要性分析。在模型构建方面,采用了Temporal Fusion Transformer (TFT)模型进行超短期预测,Informer模型进行短期预测,以及N-HiTS模型进行中长期预测。此外,文章还探讨了概率预测与风险分析,并介绍了模型部署与交易策略集成的实现。最后,文章总结了系统的贡献,并展望了未来发展方向,如市

专注AI大模型,软件混淆,授权 1264

codeforces 559C Gerald and Giant Chess (dp+乘法逆元)

题目链接: http://codeforces.com/contest/559/problem/C 题目大意: h*w的棋盘,其中有n个格子不可以走,求从左上角走到右下角有多少种方案(模1e9+7),只能向右或向下走 1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 2000 Solution: 对所有点排序 考虑dp,dp[i]表示从左上角合法地走到第i个点共有dp[i...

weixin_30384217的博客 94

ESP32-IDF开发之旅 外设篇④ 串口通信 Uart

ESP32-S3 UART串口通信详解 本文介绍了ESP32-S3的UART串口通信配置流程,涵盖硬件引脚分配、参数设置、数据收发等关键步骤。

单片机菜鸟哥的博客 495

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

CodeForces 559C Gerald and Giant Chess

C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Giant chess is quite common in Geraldi...

weixin_34062329的博客 80

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Codeforces Round #313 Div. 1】 559C Gerald and Giant Chess

组合数

Orion_Rigel 387

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于数论乘法逆元及相关知识点

在求解a/b%m时,可以转化为(a%(b*m))/b,转化过程如下 令k = (a/b)/m(向下取整), x = (a/b)%m; a/b = k*m + x (x a = k*b*m + b*x; a%(b*m) = b*x; a%(b*m)/b = x; 得证: a/b%m = a%(b*m)/b; 所有的除法取模问题都可以用这种方法,但是当b很大的时候,则会出现爆精度问题,所以引出乘法逆元,将除法取模转换为乘法取模。 b存在乘法逆元的充要条件是b与模数m互质。设令c为b的逆元,即b*c ≡ 1(

yo_bc的博客 1万+

计算组合数的三种方式

本文将详细介绍计算组合数的三种方式,这三种方式分别适用于不同的场景。

GD_ONE的博客 1万+

逆元求组合数

逆元简介 同余符号 ≡ 先bb一下 ≡,这个符号有三个意思,再这里用到的意思为“同余符号”。≡ 的介绍 两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余 记作a≡b(mod m) 读作a同余于b模m,或读作a与b关于模m同余。 比如26≡14(mod 12)。 什么是逆元 如果一个线性同余方程 ax ≡ 1(mod b) ,则 x 称为 a mod b 的逆元. 逆元的...

zqc的博客 3331

乘法逆元 求组合数取模 (模为质数)

为什么求组合数取模,可以用 乘法逆元来做。 所以求 组合数取模 就是求 % mod. 对于正整数和 p,如果有 ,那么把这个同余方程中的最小正整数解叫做 a 模 p 的逆元。 即如果% p = 1, 那么x的最小正整数解就是 a 的逆元。 可以得到 % M () % M; //费马小定理 所以% M =(% M )% M. ty...

Error Man 的博客 802

乘法逆元:快速计算组合数的秘密武器

本文介绍了乘法逆元的概念及其在模运算中的应用。乘法逆元指满足(a * x) mod m = 1的整数x,存在条件是a与m互质。文章重点讲解了费马小定理(当m为素数时,a^{-1} ≡ a^{m-2} mod m)和快速幂算法,并通过组合数计算的例题展示了实际应用。示例代码演示了如何预处理阶乘及其逆元,利用费马小定理和递推公式高效求解组合数模值,适用于大规模数据计算。该方法将传统O(n)复杂度的组合数计算优化为O(1)查询。

2602_95210426的博客 499

竞赛入门-计数问题:求组合数、乘法逆元

对于排列的第一个位置,可以是2到n之间的任意一个数字,有(n-1)种选择,对于第2位,1可以选择放在第2位,问题变成了求。简单说就是一个数a与另一个数b在某种操作下结果为1,则b就是a的逆元,a×b=1,那么b就是a的乘法逆元。对于任意一个合法的括号串,第一个括号一定是左括号( ,那么可以先去找与第一个括号匹配的右括号)在哪里,以。3.给定长度为n的01串,0表示( ,1表示 ),一个合法的括号串为010010,表示为。为例,匹配的右括号在第二个符号的位置,左边部分的待匹配串长度-2,用。

qq_20543667的博客 1011

乘法逆元求组合数

组合数公式的分母过大此时需要用乘法逆元化除为乘

weixin_41544329的博客 375

乘法逆元&组合数

要求(a / b) mod p的值,但 a 很大,无法直接求得a / b的值时,就要用到乘法逆元。 b * x ≡ 1 (mod p) x的最小正整数解k叫做b关于模p的乘法逆元。 (a / b) mod p = (a * k) mod p 证明: k = (n*p + 1) / b (a * k) mod p = (a * (n*p + 1) / b) mod p =(a...

weixin_30594001的博客 207

组合数 + 快速幂 + 逆元打表 + 阶乘打表

/** * Fuck you. * I love you too. */ #include&lt;bits/stdc++.h&gt; #define lson i&lt;&lt;2 #define rson i&lt;&lt;2|1 #define LS l,mid,lson #define RS mid+1,r,rson #define mem(a,x) memset(a,x,si...

Chuniby0的博客 533
上一篇: minisat 安装指南
下一篇: Codeforces 558C - Amr and Chemistry (枚举)
Baoli1008
博客等级 码龄12年 70粉丝 293原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值