51Nod1362 搬箱子 排列组合,中国剩余定理
原文链接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.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数. 如果 m ...
- POJ 1006 中国剩余定理
#include <cstdio> int main() { // freopen("in.txt","r",stdin); ; while(sca ...
- [TCO 2012 Round 3A Level3] CowsMooing (数论,中国剩余定理,同余方程)
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12083 这道题还是挺耐想的(至少对我来说是这样).开始时我只会60 ...
- poj1006中国剩余定理
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 103506 Accepted: 31995 Des ...
- (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)
前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...
- 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)
洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...
- 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)
洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...
- POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...
- hihocode 九十七周 中国剩余定理
题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...
随机推荐
- MS SqlServer还原数据库,出现媒体簇的结构不正确
出现此问题,是数据库版本过低导致,只要保证连接实例所在的版本号>=要还原的数据库的版本号,即可还原成功. 可以使用select @@VERSION,查看当前实例版本.
- [PHP]php缓冲 output_buffering的使用详解
bufferbuffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以使 ...
- pipeline
执行顺序:pipeline 写 pipeline类class Scrapyproject1Pipeline(object): def process_item(self, item, spider): ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- hive学习05 参数设置
001参数设置 hive执行命令的本质是mapreduce,当然也可以作为关系型数据库进行查询 --设置一个job有多少个reducer处理,依据多少的是文件的大小,默认1G set hive.exe ...
- FormData中delete方法在ios不兼容
1.移动端直接用的input的file上传图片(name=“file”必填) <input type="file" id="exampleInputFile1&qu ...
- python 面向对象编程(高级篇)
飞机票 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对 ...
- Oracle12c Data Guard搭建手册
Oracle12c Data Guard搭建手册 注:本文来源: 红黑联盟 < Oracle12c Data Guard搭建手册 > Oracle 12c 的DataGuard 是在CDB ...
- Confluence 6 启用 OpenSearch
在 OpenSearch autodiscovery 自动发现,你可以添加 Confluence 搜索到你的的 Firefox 或者 IE7 查找对话框中(请参考 Searching Conflue ...
- Java语法基础常见疑惑解答
1. 类是java的最小单位,java的程序必须在类中才能运行 2. java函数加不加static有何不同 java中声明为static的方法称为静态方法或类方法.静态方法可以直接调用静态方法,访问 ...