Orz

因为有T的限制,所以不难搞出来一个$O(T^3)$的暴力dp

但我没试 据说有30分?

正解的话显然是组合数学啦

首先$n,m$可能为负,但这并没有影响,

我们可以都把它搞成正的 即都看作向右上方走

那么可以想到真正有效的步都是向右或者向上走的 其它两个方向都是在起反作用

设u为向上走步数,d下,l左,r右

它们满足关系:

$r-l=m,u-d=n,T=u+d+l+r$

因为有效步数为$m+n$,所以$T-m-n$必为偶数

因为要保证剩下的步上下均分,左右均分

枚举$udlr$其中一个可得最终答案:

$ans=\sum \limits_{i=n,2|(i-n)}^{t-m} \binom{t}{i} \binom{i}{\frac{i-n}{2}} \binom{t-i}{\frac{t-i-m}{2}}$

(从天皇那里copy过来的)

按道理讲本题应该结束了

但丧心病狂的出题人还要恶心你一下:模数可能不为质数

但也给出一定是几个互不相同的质数之积,从exLucas的魔爪中拯救了我们

之后就中国剩余定理就行了

把模数分解出质因子$p[i]$,对于每个因子都算一边答案,记为$ans[i]$

那么得到最后答案的过程,就相当于求解

$\begin{cases} x\equiv ans_1(mod\ p_1)\\ x\equiv ans_2(mod\ p_2)\\ x\equiv ans_3(mod\ p_3)\\ ...\\ x\equiv ans_n(mod\ p_n)\\ \end{cases}$

这不裸的CRT么?板子打一遍就完事了。

扩欧都不用打,可以用前边的快速幂 结合费马小定理 解CRT里的同余方程。

//#define R
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#define re register
using namespace std;
const int N=;
typedef long long ll;
int T,mod,n,m;
ll fac[N],ans[];
vector<int> fact;
int abss(int x)
{
return x<?-x:x;
}
void divi(int x)
{
int sq=sqrt(x)+;
for(int i=;i<=sq;i++)
{
if(x%i==)
{
fact.push_back(i);
while(x%i==)x/=i;
}
if(x==)break;
}
if(x!=)fact.push_back(x);
}
ll qpow(ll a,ll b,ll p)
{
ll res=;a=a%p;
while(b)
{
if(b&)res=res*a%p;
a=a*a%p;
b>>=;
}
return res;
}
ll C(ll x,ll y,ll p)
{
if(x<y)return ;
return fac[x]*qpow(fac[y],p-,p)%p*qpow(fac[x-y],p-,p)%p;
}
ll lucas(ll x,ll y,ll p)
{
if(!y)return ;
return C(x%p,y%p,p)*lucas(x/p,y/p,p)%p;
}
void getfac(ll p)
{
fac[]=;
for(int i=;i<=T;i++)
fac[i]=1LL*i*fac[i-]%p;
}
int main()
{
scanf("%d%d%d%d",&T,&mod,&n,&m);
n=abss(n),m=abss(m);
divi(mod);
int sz=fact.size();
for(re int now=;now<sz;now++)
{
int p=fact[now];getfac(p);
for(re int i=n;i<=T-m;i++)
{
if((i-n)&||(T-i-m)&)continue;
ll res=;
res=res*lucas(T,i,p)%p*lucas(i,(i-n)/,p)%p*lucas(T-i,(T-i-m)/,p)%p;
ans[now]=(ans[now]+res)%p;
}
}
ll anss=;
for(re int i=;i<sz;i++)
{
ll times=mod/fact[i];
ll ress=qpow(times,fact[i]-,fact[i]);
ress=(ress%fact[i]+fact[i])%fact[i];
anss=(anss+times*ress*ans[i])%mod;
}
cout<<(anss+mod)%mod<<endl;
return ;
}

[NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)的更多相关文章

  1. [NOIP模拟测试37]反思+题解

    一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...

  2. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  3. [NOIP模拟测试32]反思+题解

    又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...

  4. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  5. NOIP模拟测试7

    期望得分:60+60+60 实际得分:60+60+0 这次考试主要是T3搜索打挂了(我可是靠搜索吃饭的); 1.数组开小了,不过开大数组只拿到了10分的好成绩. 2.题意没审清(其实是他没说清). 以 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  9. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

随机推荐

  1. 区间第k大的几种解法

    区间第K大问题,变化包括带修改和不带修改,强制在线和允许离线 修改主要是单点修改,我们前面也只讨论这种情况. 接下来我们从编程复杂度和时空复杂度来讨论几种做法. 1.整体二分(编程复杂度:低-中,时间 ...

  2. 【Flutter学习】页面跳转之路由及导航

    一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...

  3. CSS入门之盒模型(六分之四)

    盒模型要点知识 务必注意看,这可是前端面试 必定会遇到 的问题. box-sizing 盒模型的主要CSS属性,除继承外有两个值: content-box 这里不再细说历史原因,只说其作用. cont ...

  4. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】06、Mybatis+SQLServer集成

    1.增加POM依赖 注意pagehelper插件,我重写过,可以到我的这篇文章了解https://www.cnblogs.com/LiveYourLife/p/9176934.html <dep ...

  5. 用define 宏定义注释符号

    上面对define 的使用都很简单,再看看下面的例子:#define BSC //#define BMC /*#define EMC */D),BSC my single-line commentE) ...

  6. python学习笔记:通配符之glob模块(过滤)

    glob模块用来查找文件目录和文件,可以和常用的find功能进行类比.glob支持*?[]这三种通配符.返回的数据类型是list.常见的两个方法有glob.glob()和glob.iglob(),ig ...

  7. 【Linux】- 同步网络时间

    转自:Linux同步网络时间 Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用 ...

  8. 纯css设置元素过渡效果

    1.首先,先设置一个div,待会我们使用css3给这个div设置过渡效果. 2.然后给div设置宽高和背景,这里我就设置成200像素,深粉色. 3.接着开始设置transition属性,通过这个属性就 ...

  9. docker--删除container和image

    docker的命令分两类Management Commands和Commands Management Commands是对docker里的对象进行管理的 [root@localhost docker ...

  10. OOP三大特性及几大设计原则

    封装: 1.隐藏实现细节:2.恰当地公开接口:3.将接口和实现分开,增强可维护性:(实现细节改变时,使用该类的客户端程序不需要改变) 继承: 1.描述联结类的层次模型;2.通过抽象,表达共性,实现类的 ...