HZOI20190722 B visit 组合数+CRT合并
题目:https://www.cnblogs.com/Juve/articles/11226266.html
solution:
30%:dp
设dp[k][i][j]表示经过k时间,在(i,j)的方案数
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MAXN 105
using namespace std;
ll dp[MAXN][MAXN<<][MAXN<<],t,n,m,mod;
int main(){
scanf("%lld%lld%lld%lld",&t,&mod,&n,&m);
if(n<) n=-n;
if(m<) m=-m;
if((t-n-m)&){
cout<<<<endl;
return ;
}
int xkl=;
dp[][xkl][xkl]=;
for(ll i=;i<=t;i++){
for(ll j=-t;j<=t;j++){
for(ll k=-t;k<=t;k++){
dp[i][j+xkl][k+xkl]=(dp[i][j+xkl][k+xkl]+dp[i-][j+xkl][k++xkl]+dp[i-][j+xkl][k-+xkl]+dp[i-][j-+xkl][k+xkl]+dp[i-][j++xkl][k+xkl])%mod;
}
}
}
cout<<dp[t][n+xkl][m+xkl]%mod<<endl;
return ;
}
它可以走到-t,所以要防爆
正解:(转载Barca)
我们设ri,le,up,down分别为向右左上下走的步数,且总步数为T,
然后我们只要知道,向一个方向走的步数就能得到其他的,但是我们发现光凭一个是求不出的,
我们再转化一下思路,我们设在上下方向走的步数为k,则up+down=k,
然后又因为他最后必须走到(n,m),所以向上走的步数减去向下走的步数为m,即up-down=m,
同理我们可以求出ri与le的关系,同样是两个方程,
这样我们就可以通过枚举k,来得到向各个方向走的步数,这样就能列出组合数的式子了,即:
ans=
(不知为何我数学公式挂了)
$\sum \limits_{k=m}^{t-n}C_t^k*C_k^{\frac{k-m}{2}}*C_{n-k}^{\frac{t-k-n}{2}}$
-------->这有什么错吗?
但你这样也只有60分,因为mod不一定是质数
那我们可以CRT合并
先对mod分解因数,再用lucas求出mod每个因数下的ans,然后发现一个方程组
$\begin{cases} x & \equiv & ans_1 (mod\ p_1) \\ x & \equiv & ans_2 (mod\ p_2) \\ & \vdots & \\ x & \equiv & ans_n (mod\ p_n) \end{cases}$
from Rorschach_XR 为什么今天我Latex挂掉了,rp++14:38它终于好了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
#define MAXN 100005
using namespace std;
ll t,n,m,mod,ans[MAXN];
ll q_pow(ll a,ll b,ll p){
ll res=1;
while(b){
if(b&1) res=(res*a)%p;
a=(a*a)%p;
b>>=1;
}
return res%p;
}
ll tot=0,prime[MAXN];
void divide(ll p){//分解质因数
ll t=(ll)sqrt(p);
for(ll i=2;i<=t;i++){
if(p%i==0){
prime[++tot]=i;
p/=i;
}
}
if(p>1) prime[++tot]=p;
}
ll fac[MAXN];
void get_fac(ll p){
fac[0]=fac[1]=1;
for(ll i=2;i<=t;i++)
fac[i]=fac[i-1]*i%p;
}
ll C(ll n,ll m,ll p){
if(m>n) return 0;
return fac[n]*q_pow(fac[m]*fac[n-m]%p,p-2,p)%p;
}
ll lucas(ll n,ll m,ll p){
if(m==0) return 1;
return C(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
}
ll CRT(ll ans[]){
ll res=0;
for(ll i=1;i<=tot;i++)
res=(res+mod/prime[i]*ans[i]%mod*q_pow(mod/prime[i],prime[i]-2,prime[i])%mod)%mod;
return res;
}
int main(){
scanf("%lld%lld%lld%lld",&t,&mod,&n,&m);
if(n<0) n=-n;
if(m<0) m=-m;
divide(mod);//分解质因数
for(ll i=1;i<=tot;i++){
get_fac(prime[i]);//mod(prime[i])意义下的fac
for(ll k=n;k<=t-m;k+=2)//步数不能为1
ans[i]=(ans[i]+lucas(t,k,prime[i])*lucas(k,(k-n)/2,prime[i])%mod*lucas(t-k,(t-m-k)/2,prime[i])%mod)%mod;
}
printf("%lld\n",CRT(ans)%mod);
return 0;
}
HZOI20190722 B visit 组合数+CRT合并的更多相关文章
- 【BZOJ2142】礼物 组合数+CRT
[BZOJ2142]礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在 ...
- P2480 [SDOI2010]古代猪文 Lucas+CRT合并
\(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...
- 华农oj 2192: hzk又在打人【CRT合并/待补】
2192: hzk又在打人 Time Limit: 12 Sec Memory Limit: 512 MB Submit: 52 Solved: 1 [Submit][Status][Web Boar ...
- 组合数取模(lucas定理+CRT合并)(AC)
#include<bits/stdc++.h> #define re register #define int long long using namespace std; ; inlin ...
- 【CF896D】Nephren Runs a Cinema 卡特兰数+组合数+CRT
[CF896D]Nephren Runs a Cinema 题意:一个序列中有n格数,每个数可能是0,1,-1,如果一个序列的所有前缀和都>=0且总和$\in [L,R]$,那么我们称这个序列是 ...
- bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)
传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...
- BZOJ_2142_礼物_扩展lucas+组合数取模+CRT
BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...
- OI中组合数的若干求法与CRT
OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...
- 5.20 省选模拟赛 求和 组合数的性质 EGF CRT
LINK:求和 绝妙的一道题目.没做绝对亏了. 对于第一个subtask 考虑直接递推出组合数. 对于第二个subtask 考虑EGF 设两个EGF 都只含偶数项指标且系数为1的那种 一个到n一个到m ...
随机推荐
- 【JZOJ6345】ZYB建围墙
description analysis 打表找规律,自认为样例给的提示很明显 容易想到最优方案是让家庭尽量先围成一个正六边形,剩下的在最外层绕一个圈 手推一波可以知道,如果正六边形有\(n\)层,剩 ...
- 强连通图缩点——cf999E
问题转换成缩点求度数为0的点的个数,s点所在联通块作额外处理 缩点写的很烂调了一早上.. #include<bits/stdc++.h> #include<vector> us ...
- 分享一些PPT模板
链接:https://pan.baidu.com/s/1ADlYzx7sWR2z0ltVt8kIAQ 提取码:tyzv
- R语言中的线性判别分析_r语言 线性判别分析
R语言中的线性判别分析_r语言 线性判别分析 在R语言中,线性判别分析(Liner Discriminant Analysis,简称LDA),依靠软件包MASS中有线性判别函数lqa()来实现.该函数 ...
- AtCoder ABC 130E Common Subsequence
题目链接:https://atcoder.jp/contests/abc130/tasks/abc130_e 题目大意 给定一个长度为 N 的序列 S 和一个长度为 M 的序列 T,问 S 和 T 中 ...
- java设计模式系列1-- 概述
准备开始写些设计模式的随笔,这是第一篇,概述主要回顾下六大原则 先用轻松和谐的语言描述下这6个原则: 单一职责 每个类甚至每个方法都只要做自己分内的事,不要背别人的锅,也就是功能要分类,代码要解耦 里 ...
- 一次完整的HTTP请求与响应涉及哪些知识?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:Ruheng 地址:http://www.jianshu.com/p/c1d6a294d3c0 本文以HTTP请求和响 ...
- MyBatis与Hibernate
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句.mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和s ...
- jdk11.0.2安装
1.去官网下载合适的jdk 网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.ht ...
- cdq分治(偏序)
偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题 ...