原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1362.html

题目传送门 - 51Nod1362

题意

题解

  首先考虑枚举斜着走了几次。假设走了 $k$ 次,那么显然竖着走了 $n-k$ 次,将他们排列一下,有 $\binom{n}{k}$ 种排列。

  设往下走 $k$ 次,往右走最多 $m$ 次的方案数为:

$$F_{n,m}=\sum_{i=0}^m \binom{i+n}{n}$$

  则

$$\begin{eqnarray*}F_{n,m}&=&\sum_{i=0}^m \binom{i+n}{n}\\&=&\sum_{i=0}^{m} \left(\binom{i+n-1}{n}+\binom{i+n-1}{n-1}\right)\\&=&\sum_{i=1}^{m}\binom{(i-1)+n}{n}+\sum_{i=0}^{m} \binom{i+(n-1)}{(n-1)}\\&=&F_{n,m-1}+F_{n-1,m}\end{eqnarray*}$$

  考虑计算边界情况的 $F$ 值,有:

$$\begin{cases}F_{i,0}=\binom{i}{i}=1\\F_{0,i}=\sum_{j=0}^{i}\binom{j}{j}=i+1\end{cases}$$

  不难发现,

$$F_{n,m}=\binom{n+1}{m}$$

  所以每一个 $F_{n,m}$ 都可以 $O(n)$ 来求,但是由于模数并不是大素数,所以我们需要分解模数并用互质情况下的 CRT 合并,所以要带一个 $\log$ 。

  于是,最终答案为

$$\sum_{i=0}^{n}\binom{n}{i}\binom{n+m-i+1}{n+1}$$

  总时间复杂度为 $O(n^2\log m)$ 。

  由于我偷了个懒,没有预处理,所以我的代码的时间复杂度为 $O(n^2\log^2 m)$ 。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=805;
int n,m,X;
int p[20],q[20],cnt=0;
int C[N][N];
void Get_Small_C(int mod){
memset(C,0,sizeof C);
for (int i=0;i<=n;i++)
C[i][i]=C[i][0]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
void Get_Factors(int x){
cnt=0;
for (int i=2;i*i<=x;i++)
if (x%i==0){
p[++cnt]=i,q[cnt]=0;
while (x%i==0)
x/=i,q[cnt]++;
}
if (x>1)
p[++cnt]=x,q[cnt]=1;
}
int Pow(int x,int y,int mod){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int Phi(int p,int q){
return (p-1)*Pow(p,q-1,X+1);
}
int Large_C(int n,int m,int p,int q){
if (m>n||m<0)
return 0;
int pw=Pow(p,q,X+1),phi=Phi(p,q);
int cntp=0,C=1;
for (int i=1;i<=m;i++){
int a=n-i+1,b=i;
while (a%p==0)
a/=p,cntp++;
while (b%p==0)
b/=p,cntp--;
C=1LL*C*a%pw*Pow(b,phi-1,pw)%pw;
}
return 1LL*C*Pow(p,cntp,pw)%pw;
}
void ex_gcd(int a,int b,int &x,int &y){
if (!b){
x=1,y=0;
return;
}
ex_gcd(b,a%b,y,x);
y-=x*(a/b);
}
int CRT(int *v,int n){
int A=0,M=1;
for (int i=1;i<=n;i++){
int a=v[i],m=Pow(p[i],q[i],X+1);
int t=a-A,x,y;
ex_gcd(M,m,x,y);
x=1LL*x*t%m;
A=(1LL*x*M+A)%(M*m);
M*=m;
}
return (A+X)%X;
}
int Large_C(int n,int m){
if (m>n||m<0)
return 0;
int res[20];
for (int i=1;i<=cnt;i++)
res[i]=Large_C(n,m,p[i],q[i]);
return CRT(res,cnt);
}
int main(){
while (~scanf("%d%d%d",&n,&m,&X)){
Get_Small_C(X);
Get_Factors(X);
int ans=0;
for (int i=0;i<=n;i++)
ans=(1LL*C[n][i]*Large_C(n+m-i+1,n+1)+ans)%X;
printf("%d\n",ans);
}
return 0;
}
/*
枚举斜着走了几次,然后推式子。
*/

  

51Nod1362 搬箱子 排列组合,中国剩余定理的更多相关文章

  1. 《孙子算经》之"物不知数"题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

  2. POJ 1006 中国剩余定理

    #include <cstdio> int main() { // freopen("in.txt","r",stdin); ; while(sca ...

  3. [TCO 2012 Round 3A Level3] CowsMooing (数论,中国剩余定理,同余方程)

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=12083 这道题还是挺耐想的(至少对我来说是这样).开始时我只会60 ...

  4. poj1006中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103506   Accepted: 31995 Des ...

  5. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

  6. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  7. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

  8. POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...

  9. hihocode 九十七周 中国剩余定理

    题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...

随机推荐

  1. ER/数据库建模工具之MySQL Workbench的使用

    参考:https://blog.csdn.net/soulandswear/article/details/60966808 待后续整理...

  2. 软件包.deb的安装及卸载------dpkg

    文章链接:https://blog.csdn.net/qq_36764147/article/details/81332606 删除带有rc的软件包:https://blog.csdn.net/chr ...

  3. 《Spring5官方文档》新功能(4,3)

    <Spring5官方文档>新功能 原文链接 译者:supriseli Spring框架的新功能 这一章主要提供Spring框架新的功能和变更. 升级到新版本的框架可以参考.Spring g ...

  4. Python traceback的优雅处理

    刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...

  5. FileStorage

    1. 函数说明                  功能 函数声明 参数 FileStorage构造函数 cv::FileStorage:: FileStorage(const String& ...

  6. L1和L2正则

    https://blog.csdn.net/jinping_shi/article/details/52433975

  7. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  8. Confluence 6 升级自定义的站点和空间关闭缓存

    Velocity 被配置在内存中使用缓存模板.当你在 Confluence 中编辑了页面的模板文件,Confluence 知道文件进行了编辑,将会重新从磁盘中载入模板文件.如果你直接在 Conflue ...

  9. 【Linux】添加DNS

    1.添加DNS输入命令: vi /etc/resolv.conf 添加一行:nameserver 10.41.132.9 2.查看DNS nslookup 127.0.0.1 | grep Serve ...

  10. django 中的闪现

    导包 from django.contrib import messages #输出格式 messages.success(request,'不能为空') #前端页面的写法 {%if messages ...