没做过ex_Lucas的同学可以先看看这个:组合数学专题《礼物》题解。顺便把那道题水了。

强烈推荐tdcp的解,只用求2个组合数,考场打表,没有为什么:

有一个公式蛮重要的,竟然还有人不知道?

有一共n种共k个物品,每一种有a1,a2,a3...an个,它们本质不同的排列数是

$ \frac{k!}{a_1 ! \times a_2 ! \times a_3 ! \times ... \times a_n !}  (\sum\limits_{i=1}^n a_i =k) $

要解释嘛?解释一下吧。

首先对所有物品进行全排列,k!

而对于每一种物品,把它从这k个里提出来,其内部的顺序被重复计算了

所以要除掉它内部的全排列,即ai!。

那么接下来我们来看着道题。

首先,我们可以发现,nm的正负对解题没有影响,统一把它当作正的就好(向右,上为正方向)

那么如果我们一共向左走了a步,那么必须向右走n+a步,同理向下b步就要向上m+b步.(a,b,n-a,m-b均为自然数)

t=(a)+(n+a)+(b)+(m+b)=n+m+2a+2b

t-n-m=2a+2b=2(a+b)

所以说,如果t-n-m为奇数或负数,方案数为0。

在这个式子里面我们未知的只有a和b。枚举其一就能得到另一个。

假如我们现在已经确定了一对a,b,如何求解方案数?

我们有a左(n+a)右b下(m+b)上,我们现在要求这些操作的排列数。

根据我开头说的那个式子,就挺好写出算式了:(开头那个式子记住吧,挺重要的)

$ \frac{t !}{a !\times b! \times (n+a)! \times (m+b)!} $

接下来的问题是如何计算。。。

对于60%的数据,p是一个质数,简单啊,直接Lucas或阶乘逆元硬干就好了啊

(如果你连朴素Lucas都不知道,那我救不了你了)

但是对于全部数据,p可以是一个合数。。。就是礼物那道题了。

分解p得到若干质数,对于这些质数取模分别求解。

在求解对于某一个分解后的质数取模时,套一个朴素Lucas即可。

最后一个CRT合并答案。

---接下来你可以选择不看---

然而我打的十分麻烦。。。我并没有发现需要ex_Lucas和普通Lucas。我以为直接CRT就可以。

然而40分。懵了一阵。

仔细一看发现,因为它有小质数所以会爆炸。

如果要计算$1 \times 3 \div 3 (mod 3)$,那么我会先算1×3=3,取模变成0,在除以3还是0。

呃。。。什么玩意啊!

后来一想,它不就像ex_Lucas一样吗?只要分离记录那个质数的次数不就好了吗?

然后我就暴力计算指数的次数,暴力算阶乘。

那么在上式枚举的过程中,a每增大1,组合数怎么计算?

我很“机智”的想到了,这不和划艇那题的组合数递推挺像吗?(错误的“做题长记性”)

既然a是枚举的,每当a增大1,那个式子只需要除a再除n+a再乘b+1再乘m+b+1不就好了吗?

乘除不能直接乘除,要把分解后的质数提出来。完事!

完美。

完美?

对,对,对是对了,运行倒数第二,码长也十分惊人。

但是因为没有预处理阶乘和逆元,少开了不少数组,内存492k倒是最小的。

思维量挺大,理论上是好事,可是在考场上。。。

不建议按我这个思路打,但是你们可以顺着我的思路想一想,万一用上了呢?

好了,就这样吧,有什么不懂的去评论区喷我就行,看到就回复。

这题讲的有点草率,因为要去写T3的题解。

哦对了,还有,因为我的思路清奇,所以代码还是去颓别人的吧。

 #include<cstdio>
#define int long long
#define orz mod[modi]
int Mod,mod[],mods,t,n,m,ans[],Ans,x,y;
int pow(int b,int mod,int ans=){
for(int t=mod-;t;t>>=,b=b*b%mod) if(t&) ans=ans*b%mod;
return ans;
}
void exgcd(int a,int b,int &x,int &y){
if(!b){x=;y=;return;}
exgcd(b,a%b,x,y);
int res=x;x=y;y=res-a/b*x;
}
signed main(){
scanf("%lld%lld%lld%lld",&t,&Mod,&n,&m);
if(n<)n=-n; if(m<)m=-m;
if(t<n+m){puts("");return ;}
if(t-n-m&){puts("");return ;}
for(int mm=Mod,i=;i<=;++i)
if(mm%i==)mod[++mods]=i,mm/=i;
else if(i==&&mm!=)mod[++mods]=mm;
for(int modi=;modi<=mods;++modi){
int na=n,a=,mb=m+(t-n-m)/,b=(t-n-m)/,C=,tms=;
for(int i=;i<=t;++i){
int res=i;
while(res%orz==)tms++,res/=orz;
C=C*res%orz;
}//printf("-%lld %lld\n",C,tms);
for(int i=;i<=na;++i){
int res=i;
while(res%orz==)tms--,res/=orz;
C=C*pow(res,orz)%orz;
}//printf("--%lld %lld\n",C,tms);
for(int i=;i<=mb;++i){
int res=i;
while(res%orz==)tms--,res/=orz;
C=C*pow(res,orz)%orz;
}//printf("---%lld %lld\n",C,tms);
for(int i=;i<=b;++i){
int res=i;
while(res%orz==)tms--,res/=orz;
C=C*pow(res,orz)%orz;
}//printf("----%lld %lld\n",C,tms);
ans[modi]=(ans[modi]+(tms?:C))%orz;
while(b){
b--;mb--;a++;na++;int res;
res=b+;while(res%orz==)tms++,res/=orz;C=C*res%orz;
res=mb+;while(res%orz==)tms++,res/=orz;C=C*res%orz;
res=a;while(res%orz==)tms--,res/=orz;C=C*pow(res,orz)%orz;
res=na;while(res%orz==)tms--,res/=orz;C=C*pow(res,orz)%orz;
(ans[modi]+=(tms?:C))%=orz;//printf("-----%lld %lld\n",C,tms);
}
exgcd(Mod/orz,orz,x,y); x*=ans[modi]; x=(x%orz+orz)%orz;
(Ans+=Mod/orz*x%Mod)%=Mod;
}
//for(int i=1;i<=mods;++i)printf("%lld %lld\n",mod[i],ans[i]);
printf("%lld\n",Ans);
}

形式化地放着

visit:组合数学,ex_Lucas的更多相关文章

  1. 模拟7题解 T2visit

    T2 visit [组合数学][中国剩余定理] 一场考试难得见两个数学题 本来想矩阵快速幂,显然空间复杂度不行,主要是没时间,就没打 正解: 首先推波式子 1.$C_{t}^{k}$    在t步中总 ...

  2. HZOJ 20190722 visit (组合数学+数论)

    考试T2,考试时打了个$O(n^3)$dp暴力,思路还是很好想的,但细节也不少,然后滚动数组没清空,而且题又看错了,只得了10pts,真是血的教训. 题解: 其实看数据范围,给出了模数是否为质数,其实 ...

  3. [NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)

    Orz 因为有T的限制,所以不难搞出来一个$O(T^3)$的暴力dp 但我没试 据说有30分? 正解的话显然是组合数学啦 首先$n,m$可能为负,但这并没有影响, 我们可以都把它搞成正的 即都看作向右 ...

  4. [CSP-S模拟测试]:visit(组合数学+exLucas+CRT)

    题目传送门(内部题6) 输入格式 第一行包含两个整数$T$,$MOD$:第二行包含两个整数$n$,$m$,表示$dirty$房子的位置. 输出格式 一行一个整数,表示对$MOD$取模之后的答案. 样例 ...

  5. [SinGuLaRiTy] 组合数学题目复习

    [SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017.  All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...

  6. hdu4607 Park Visit(树的直径)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  8. 数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!

    Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a ta ...

  9. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

随机推荐

  1. JavaWeb http协议的自我描述

    1.http协议的组成 http:规范那种协议 localhost.127.0.0.1:访问的ip地址(默认,根据自己的需求改变) 端口号:8080(默认,根据自己的需求改变) 工程:XXX 资源:可 ...

  2. Python 爬虫(四):Selenium 框架

    Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样.它支持多种平台:Windows.Linux.Mac,支持多种语言:Python.Perl. ...

  3. 04-10 Bagging和随机森林

    目录 Bagging算法和随机森林 一.Bagging算法和随机森林学习目标 二.Bagging算法原理回顾 三.Bagging算法流程 3.1 输入 3.2 输出 3.3 流程 四.随机森林详解 4 ...

  4. iptables详解之filter

    iptables详解之filter iptables令很多小伙伴脑阔疼,下面我们来说说如何使用iptables. 一.iptables格式 1.1.iptables 帮助 通过iptables --h ...

  5. Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

    使用vue init webpack 你的项目名称初始化一个vue的项目 安装依赖 npm install vue-resource http-proxy-middleware vuex koa 在项 ...

  6. Jmeter结构体系及运行顺序

    一:jmeter运行原理: jmeter时以线程的方式来运行的(由于jmeter是java开发的所以是运行在JVM虚拟机上的,java也是支持多线程的) 二:jmeter结构体系 1.取样器smapl ...

  7. 经典的Redis的主从复制搭建

    ##### 配置服务器   1).打开redis.conf文件修改 bind 指定的ip地址: ![image](https://img2018.cnblogs.com/blog/1334966/20 ...

  8. axios学习和使用

    网络请求的方式 传统的Ajax,基于XMLHttpRequest(不推荐) 配置调用方式混乱(回调地狱) jQuery-Ajax (在vue开发中不推荐) 相对于传统的Ajax非常好用 但是jQuer ...

  9. comparator接口实现时,只需要实现 int compare(T o1, T o2)方法?

    从Comparator接口的源码,可以看到Comparator接口中的方法有三类: 1 普通接口方法 2 default方法 3 static方法 其中default方法和static方法 是java ...

  10. 17.Linux高可用之Keepalived

    1.什么是高可用,为什么要设计高可用? 两台机器启动着相同的业务系统,当有一台机器宕机,另外一台服务器能快速的接管,对于访问的用户是无感知的. 减少系统不能提供服务的时间. 2.高可用使用什么工具来实 ...