原文链接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. 前端 ----jQuery的文件操作

    06-jQuery的文档操作***   之前js中咱们学习了js的DOM操作,也就是所谓的增删改查DOM操作.通过js的DOM的操作,大家也能发现,大量的繁琐代码实现我们想要的效果.那么jQuery的 ...

  2. (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题

    #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...

  3. ajax控件无法使用 iis配置及web修改(转载)

    1.Web.config配置问题:将Web.config中的相关节配置成如下,然后重新编译你的程序:<httpHandlers><remove verb="*" ...

  4. ionic3 点击input 弹出白色遮罩 遮挡上部内容

    在Manifest中的activity里设置android:windowSoftInputMode为adjustPan,默认为adjustResize,当前窗口的内容将自动移动以便当前焦点从不被键盘覆 ...

  5. centos忘记密码

    1.启动时按上下箭头,然后按e进入进入编辑模式 2.上下箭头切换在选择 linux ...这行在末尾输入 LANG=en_US.UTF-8 init=/bin/sh 然后按 ctrl+x 进行引导 3 ...

  6. 【python】ftp连接,主被动,调试等级

    示例代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import os from ftplib import FTP def ftp_down( ...

  7. 怎么编辑PDF,如何给PDF加水印

    在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...

  8. SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...

  9. 存储区域网络(Storage Area Network,简称SAN)

    存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服 ...

  10. 异常:Keyword not supported: 'data source'的解决办法

    将连接字符串中的&quot换为“'”,一个单引号即可. 详细解释:https://blogs.msdn.microsoft.com/rickandy/2008/12/09/explicit-c ...