题目: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合并的更多相关文章

  1. 【BZOJ2142】礼物 组合数+CRT

    [BZOJ2142]礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在 ...

  2. P2480 [SDOI2010]古代猪文 Lucas+CRT合并

    \(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...

  3. 华农oj 2192: hzk又在打人【CRT合并/待补】

    2192: hzk又在打人 Time Limit: 12 Sec Memory Limit: 512 MB Submit: 52 Solved: 1 [Submit][Status][Web Boar ...

  4. 组合数取模(lucas定理+CRT合并)(AC)

    #include<bits/stdc++.h> #define re register #define int long long using namespace std; ; inlin ...

  5. 【CF896D】Nephren Runs a Cinema 卡特兰数+组合数+CRT

    [CF896D]Nephren Runs a Cinema 题意:一个序列中有n格数,每个数可能是0,1,-1,如果一个序列的所有前缀和都>=0且总和$\in [L,R]$,那么我们称这个序列是 ...

  6. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  7. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

  8. OI中组合数的若干求法与CRT

    OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...

  9. 5.20 省选模拟赛 求和 组合数的性质 EGF CRT

    LINK:求和 绝妙的一道题目.没做绝对亏了. 对于第一个subtask 考虑直接递推出组合数. 对于第二个subtask 考虑EGF 设两个EGF 都只含偶数项指标且系数为1的那种 一个到n一个到m ...

随机推荐

  1. thinkphp ajax返回

    ThinkPHP可以很好的支持AJAX请求,系统的\Think\Controller类提供了ajaxReturn方法用于AJAX调用后返回数据给客户端.并且支持JSON.JSONP.XML和EVAL四 ...

  2. 0921CSP-S模拟测试赛后总结

    倒数第一祭. 感觉T3数据范围50可以qj一下.于是押了T3. 然后两个小时调我4.1k的bfs.最后调出来了发现策略错了.十分绝望. T120分吊住了.十分难过.倒数第一了.还是实力不行. 不应该押 ...

  3. 线性dp——cf1067A

    考虑三种情况,刷表dp+前缀和预处理即可 #include<bits/stdc++.h> using namespace std; ; ],f[][][],ans,s; int main( ...

  4. C++如何判断某一文件是否存在

    函数名: access 功 能: 确定文件的访问权限 用 法: int access(const char *filename, int amode); 程序例: #include <stdio ...

  5. Taro框架---左滑动删除

    index.js import Taro, { Component } from '@tarojs/taro' import { View,ScrollView } from '@tarojs/com ...

  6. VS2010-MFC(字体和文本输出:文本输出)

    转自:http://www.jizhuomi.com/software/241.html 上一节讲了CFont字体类,本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确 ...

  7. HTML基本案列

    <html> <head> <!-- meta :告诉浏览器,如何翻译汉字 http-equiv :content-type 内容类型 详细内容有后面的值指定 conte ...

  8. SpringBoot--Thymeleaf入门使用

    一.概述 今天学习到了SpringBoot中的WEB开发,SpringBoot提供了spring-boot-stater-web为web开发给予支持,它里面内嵌了以下依赖: <dependenc ...

  9. 使用Python实现不同目录下文件的拷贝

    目标:要实现将一台计算机的共享文件夹中的文件备份到另一台计算机,如果存在同名的文件只要文件的大小和最后修改时间一致,则不拷贝该文件 python版本:Python3.7.1 python脚本: fro ...

  10. 大型SQL文件导入mysql方案

    一. 场景 现有俩个体积较大的单表sql文件,一个为8G,一个为4G,要在一天内完整导入到阿里云的mysql中,需要同时蛮子时间和空间这俩种要求. 二. 思路 搜索了网上一堆的方案,总结了如下几个: ...