题目大意

从 \((0,0)\) 开始,每次只可走上下左右一个单位长度,可走重复路,求第 \(T\) 步正好走到 \((n,m)\) 的方案数。

答案要求对 \(MOD\) 取模,\(MOD\) 保证是几个不同质数的乘积。

数据范围

\(1\leq T\leq 100000;-T\leq n,m\leq T;1\leq MOD\leq 10^9+7\)

样例输入

4 10

2 2

样例输出

6

思路

枚举向左走了 \(l\) 步,则向右走了 \(r\) 步,向上走了 \(u\) 步,向下走了 \(d\) 步,依据高考数学中的平均分组问题,答案就是:

\[\frac{A_T^T}{A_l^l\ A_r^r\ A_u^u\ A_d^d}=C_T^l\ C_{T-l}^r\ C_{T-l-r}^u
\]

但是这个式子比较繁琐不好计算,但是聚聚 \(\texttt{skyh}\) 给出了一个简单的式子:

\[C_T^{\frac{T-n-m}{2}}\ C_T^{\frac{T-\vert n-m\vert}{2}}
\]

问了数奥的同学该式子的正确性,请大家学习

显然使用 \(Lucas\) 定理求解。

噫,好,我会了!

然后一顿怒操作发现样例输出 \(0\)。这是因为在模 \(10\) 的意义下样例是没有逆元的。所以我们需要将模数分解质因子,在每一个质因子下的模意义下求出答案,最后用 \(CRT\) 合并答案即可。

代码

数论全家桶

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
int T,Mod,N,M;
int res[maxn],fac[maxn],inv[maxn]; inline int read(){
int x=0;bool fopt=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')fopt=0;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-48;
return fopt?x:-x;
} void exgcd(int a,int b,int &x,int &y){
if(!b)return x=1,y=0,void();
exgcd(b,a%b,x,y);
int z=x;x=y;y=z-(a/b)*y;
} inline int qpow(int x,int b,int p){
int ans=1,base=x;
while(b){
if(b&1)ans=ans*base%p;
base=base*base%p;
b>>=1;
}
return ans;
} bool Miller_Rabin(int n){
if(n==2)
return true;
for(int i=1;i<=30;i++){
int a=rand()%(n-2)+2;
if(qpow(a,n,n)!=a)
return false;
}
return true;
} int v[maxn];
inline void Get(int x){
int u=sqrt(x);
for(int i=2;i<=u;i++){
if(x%i!=0)continue;
if(Miller_Rabin(i)){
v[++v[0]]=i;
x/=i;
}
}
if(x>1)v[++v[0]]=x;
} inline int C(int n,int m,int p){
if(n<m)return 0;
if(!m||n==m)return 1;
return fac[n]*inv[m]%p*inv[n-m]%p;
} int Lucas(int n,int m,int p){
if(n<m)return 0;
if(!m)return 1;
return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p;
} inline int CRT(int n){
int M=1,ans=0;
for(int i=1;i<=n;i++)
M*=v[i];
for(int i=1;i<=n;i++){
int m=M/v[i];
int x=0,y=0;
exgcd(m,v[i],x,y);
ans+=res[i]*m*(x<0?x+v[i]:x);
}
return ans%M;
} signed main(){
srand(time(0));
T=read();Mod=read();N=read();M=read();
Get(Mod);
for(int i=1;i<=v[0];i++){
int p=v[i];
fac[0]=fac[1]=inv[0]=inv[1]=1;
for(int j=2;j<=T;j++)
inv[j]=(p-p/j)*inv[p%j]%p;
for(int j=2;j<=T;j++){
inv[j]=inv[j-1]*inv[j]%p;
fac[j]=fac[j-1]*j%p;
}
res[i]=Lucas(T,(T-N-M)/2,p)*Lucas(T,(T-abs(N-M))/2,p)%p;
}
printf("%lld\n",CRT(v[0]));
return 0;
}

【组合计数】visit的更多相关文章

  1. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  2. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  3. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  4. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

  5. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  6. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  7. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

  9. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  10. 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)

    [BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...

随机推荐

  1. 手写mybatis框架-增加缓存&事务功能

    前言 在学习mybatis源码之余,自己完成了一个简单的ORM框架.已完成基本SQL的执行和对象关系映射.本周在此基础上,又加入了缓存和事务功能.所有代码都没有copy,如果也对此感兴趣,请赏个Sta ...

  2. 图解选择排序及算法优化(Java实现)

    选择排序 前言 原理:每次循环对比找出最小/大值,将最值的元素交换至左侧 思想:直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并 ...

  3. Httprunner框架学习

    前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试. 官方文档:https://docs.httprunner. ...

  4. 掌控安全less6 靶场简易--盲注

    1.判断是否存在sql注入 http://injectx1.lab.aqlab.cn:81/Pass-11/index.php?id=1"  and "1"=" ...

  5. springboot中关于Long类型返回前端精度丢失问题处理

    使用了HuTool这个雪花算法后,会出现丢失精度的问题 hutool算法使用地址 对于一些大的业务表,自增主键这里 接口层得注意下是否会产生大数值 设计接口的时候采用String类型. 在项目中,我们 ...

  6. 有关java反射的几个小方法的作用和区别

    1.Class类中 getXXX()和getDeclaredXXX()的作用和区别: 前者获取某个类的所有公共(public)的字段(or方法or构造函数),包括父类.后者获取所有的字段(or方法or ...

  7. 破壳漏洞(CVE-2014-6271)分析

    受影响版本:GNU Bash 4.3及之前版本 影响范围:主流的Linux和MacOSX操作系统,与bash交互的各种应用程序,如HTTP,FTP,DHCP等等. 漏洞原理及POC验证: 1.bash ...

  8. XXE漏洞介绍 & XXE漏洞攻击 & 修复建议

    介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...

  9. 基础篇:JAVA资源之IO、字符编码、URL和Spring.Resource

    目录 1 JAVA.IO字节流 2 JAVA.IO字符流 3 乱码问题和字符流 4 字符集和字符编码的概念区分 5 URI概念的简单介绍 6 URL概念及与URL的区别 7 Spring.Resour ...

  10. 《我想进大厂》之MQ夺命连环11问

    继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起 ...