1. 组合数取模

求 \(\dbinom nm\bmod p\)

1. \(n,m\le 200\),\(p\) 任意

递推

2. \(n,m\le 10^6\),\(p\ge 10^9\) 素数

预处理 \(n!\),\(m!^{-1}\),\((n-m)!^{-1}\) 即可 .

3. \(n,m\le 10^6\),\(p\le 2000\) 素数

注意到 \(n\) 可能是 \(p\) 的倍数,故逆元可能不存在 .

引入 Lucas 定理:

设 \(n,m\) 在 \(p\)(\(p\) 是质数)进制下表示为

\[\overline{n_kn_{k-1}n_{k-2}\dots n_1}\,,\overline{m_km_{k-1}m_{k-2}\dots m_1}
\]

其中 \(0\le n_i<p\),\(0\le m_i<p\) .

则有:

\[\dbinom{n}{m}\equiv \dbinom{n_k}{m_k}\dbinom{n_{k-1}}{m_{k-1}}\cdots\dbinom{n_1}{m_1}\pmod p
\]

Proof:

原问题等价于 \(C^n_m\equiv C^{n\bmod p}_{m\bmod p}\cdot C^{\lfloor n/p\rfloor}_{\lfloor m/p\rfloor}\pmod p\) .

设 \(x\in\mathbb N^+\),且 \(x<p\),则:

\[C^x_p=\dfrac{p!}{x!(p-x)!}=\dfrac{p\cdot (p-1)!}{x\cdot(x-1)!\cdot(p-x)!}=\dfrac px\cdot C^{x-1}_{p-1}
\]

由于 \(x<p\) 且 \(p\) 是素数,所以 \(x\) 存在模 \(p\) 意义下的逆元,因此:

\[C^x_p\equiv p\cdot x^{-1}\cdot C^{x-1}_{p-1}\pmod p
\]

因为 \(p\cdot x^{-1}\cdot C^{x-1}_{p-1}\equiv 0\pmod p\) ,故 \(C^x_p\equiv0\pmod p\).

由二项式定理,

\[(1+x)^p=\sum_{i=0}^pC_p^ix_i
\]

除了 \(i=0,i=p\) 的项数,别的模 \(p\) 均为 \(0\),所以:

\[(1+x)^p\equiv 1+x^p\pmod p
\]

现在我们设:

\[\begin{cases}\lfloor m/p\rfloor=q_m\\\lfloor n/p\rfloor=q_n\end{cases}\ ,\ \begin{cases}m\bmod p=r_m\\n\bmod p=r_n\end{cases}
\]

从而:

\[\begin{cases}m=q_mp+r_m\\n=q_np+r_n\end{cases}
\]

再由二项式定理有

\[(1+x)^m=\sum_{i=0}^mC_m^ix_i
\]

而同时又有:

\[\begin{aligned}(1+x)^m&=(1+x)^{q_mp+r_m}\\&=(1+x)^{q_mp}\cdot(q+x)^{r_m}\\&=((1+x)^q)^{m_p}\cdot(q+x)^{r_m}\\&\equiv (1+x^p)^{q_m}\cdot(1+x)^{r_m}\\&=\sum_{i=0}^{q_m}C^i_{q_m}x^{ip}\sum_{i=0}^{r_m}C^i_{r_m}x^{i}\\&=\sum_{i=0}^{q_m}\sum_{j=0}^{r_m}C^i_{q_m}C^j_{r_m}x^{ip+j}\pmod p\end{aligned}
\]

注意到 \(ip+j\) 正好能取到 \(0\) 到 \(m\) 内所有整数一次,所以枚举 \(k=ip+j\),得

\[(x+1)^m\equiv \sum_{k=0}^n C_{q_m}^{\lfloor k/p\rfloor}C_{r_m}^{k\bmod p}x^k\pmod p
\]

结合二项式定理,得

\[\sum_{k=0}^mC^k_mx^k\equiv \sum_{k=0}^n C_{q_m}^{\lfloor k/p\rfloor}C_{r_m}^{k\bmod p}x^k\pmod p
\]

对比系数,得:

\[C^n_m\equiv C^{n\bmod p}_{m\bmod p}\cdot C^{\lfloor n/p\rfloor}_{\lfloor m/p\rfloor}=C_{q_m}^{q_n}C_{r_m}^{r_n}\pmod p
\]

命题获证 .

4. \(n,m\le 10^6\),\(p=p_1p_2\cdots p_k\),\(p_1,p_2,\cdots,p_k\le 2000\) 为互不相同的素数

\[A=\dbinom nm
\]

\[\begin{cases}A\equiv \dbinom nm\pmod{p_1}\\A\equiv \dbinom nm\pmod{p_2}\\\cdots\\A\equiv \dbinom nm\pmod{p_k}\end{cases}
\]

用 Lucas 定理求组合数,然后 CRT 合并即可

2. 抽屉原理,容斥原理

1. 抽屉原理

抽屉原理:

\(n+1\) 个物品放入 \(n\) 个抽屉,必有一抽屉至少有两个物品 .

2. 容斥原理

\[\left|\bigcup_{i=1}^n A_i\right|=\sum_{B\subseteq\{A_1,A_2,\cdots,A_n\}}(-1)^{|B|+1}\left|\bigcap_{A_i\in B}A_i\right|
\]

典型题:\(n\) 夫妻问题

\(n\) 对夫妻排成一圈,共 \(2n\) 人,夫妻不能相邻,求方案数 .

前置:圆排列

\(n\) 个人排成一圈,方案数为 \((n-1)!\)(旋转算一种)(所以去除 \(n\))

对 \(n\) 夫妻问题固定每个夫妻,用容斥原理:

\[\sum_{i=0}^n(-1)^i\dbinom ni(2n-i-1)!\cdot2^i
\]

小题

1. 组合数问题

请你把 \(n\) 拆成 \(k\) 个不同的组合数之和,输出任意一种方案

两个组合数 \(\dbinom{n_1}{m_1}\,,\,\dbinom{n_2}{m_2}\) 不同当且仅当 \(n_1\neq n_2\) 或 \(m_1\neq m_2\)

\(n\le 10^9\),\(k\le 10^3\) .

乱构造

\[n=\dbinom{0}{0}+\dbinom{1}{0}+\dbinom{2}{0}+\cdots+\dbinom{k-2}{0}+\dbinom{n-k+1}{1}
\]

2. 组合数问题

\(k\) 个不同(不同的定义同上题)的组合数,求它们和的最大值 .

对于选取的组合数 \(\dbinom pq\) 要求 \(0\le p,q\le n\)

\(n\le 10^6\),\(k\le 10^5\) .

用一个堆维护最值,每次加入杨辉三角形中四周的组合数即可 .

比较两个组合数取对数即可 .

3. 组合数问题

\[\sum_{i=0}^{\infty}\mathrm{C}_{nk}^{ik+r}
\]

注意到对组合数作 \(k\) 次展开可以得到一个引理

Lemma

\[\dbinom nm=\sum_{i=0}^k\dbinom{n-k}{m-i}\dbinom ki
\]

\(k\) 为任意整数

\[\begin{aligned}A_{n,r}&=\sum_{i=0}^{\infty}\mathrm{C}_{nk}^{ik+r}\\&=\sum_{i=0}^{\infty}\sum_{j=0}^{k}\mathrm{C}_{(n-1)k}^{ik+r-j}\mathrm C_k^j\\&=\sum_{j=0}^{k}\sum_{i=0}^{\infty}\mathrm{C}_{(n-1)k}^{ik+r-j}\mathrm C_k^j\\&=\sum_{j=0}^{k}\mathrm C_k^j\sum_{i=0}^{\infty}\mathrm{C}_{(n-1)k}^{ik+r-j}\\&=\sum_{j=0}^k\mathrm C_k^j A_{n-1,r-j}\end{aligned}
\]

然后矩阵快速幂优化,时间复杂度 \(O(k^3\log n)\) .

4. 万圣节

给定 \(n\) 个数,找若干个数使得它们是 \(c\) 的倍数 .

前缀和

5. 正方形

给定平面上 \(n\) 点,用三个 \(L\times L\) 正方形覆盖所有点,求最小的 \(L\) .

二分 \(L\),判定就是两个正方形都放在角上,剩下一个再判定

下午比赛

380 pts 混了个 rank1 .

T1

给定 \(x,y\),求 \(x\bmod y\) .

\(x\le 10^{100000}\,,y\le 2^{31}\)

有手就行

T2

大小为 \(3\times N\) 的方格图,你需要用有\(M\)种颜色的大小为 \(1\times 1\) 和 \(2\times 2\) 的小方块去覆盖整个方格图。小方块和小方块之间不能互相覆盖,并且必须将整个方格图全部覆盖。求有多少种覆盖方格图的方法。两种方案不一样当且仅当存在某个位置颜色不一样或者摆放小方块的方法不一样。

.

\(N,M\le 10^9\)

推(?)个式子,然后矩乘优化

T3

\[x^{C(n,m)} \bmod 1000003471
\]

\(1\le x,n,m\le 10^5\) .

欧拉降幂,对模数质因数分解,Lucas 定理求然后 CRT 合并

T4

给定 \(N\) 个数,其中第 \(i\) 个数为 \(\gcd⁡(x,y+i-1)\) . 求任意一组可能的 \(x,y\) 的值 .

\(1\leq N\leq1000\),保证存在答案 \(x,y≤10^9\) .

考场上胡了个 \(O(y)\) 暴力,80pts .

显然 \(x=\operatorname{lcm}(a_1,a_2,\cdots,a_N)\) .

用 \(a_i=\gcd⁡(x,y+i-1)\) 列出同余方程,CRT 解出 \(y\) 即可 .

Code

T1

using namespace std;
typedef long long ll;
string str;
ll p,ans;
int main()
{
cin>>str; int l=str.length();
scanf("%lld",&p);
for (int i=0;i<l;i++) ans=(ans*10+str[i]-'0')%p;
printf("%lld\n",ans);
return 0;
}

T2

using namespace std;
typedef long long ll;
const int MOD=1e9+7,N=5;
ll n,m;
ll qpow(ll x,ll n,ll p)
{
ll ans=1;
while (n)
{
if (n&1) ans=ans*x%p;
n>>=1; x=x*x%p;
} return ans;
}
struct mat
{
ll a[N][N];
mat operator *(const mat& mD)
{
mat ans; memset(ans.a,0,sizeof ans.a);
for (int i=1;i<=2;i++)
for (int k=1;k<=2;k++)
for (int j=1;j<=2;j++)
ans.a[i][j]=(ans.a[i][j]+mD.a[k][j]*a[i][k]%MOD)%MOD;
return ans;
}
mat operator ^(int q)
{
mat ans,b=*this;
ans.a[1][1]=(qpow(m,6,MOD)+2*qpow(m,3,MOD))%MOD; ans.a[1][2]=qpow(m,3,MOD);
while (q)
{
if (q&1) ans=ans*b;
b=b*b; q>>=1;
} return ans;
}
}B;
int main()
{
scanf("%lld%lld",&n,&m);
if (n==1){printf("%lld\n",qpow(m,3,MOD)); return 0;}
if (n==2){printf("%lld\n",(qpow(m,6,MOD)+2*qpow(m,3,MOD))%MOD); return 0;}
B.a[1][1]=qpow(m,3,MOD); B.a[1][2]=1;
B.a[2][1]=2*qpow(m,3,MOD); B.a[2][2]=0;
printf("%lld",(B^(n-2)).a[1][1]%MOD);
return 0;
}

T3

using namespace std;
typedef long long ll;
const int List[]={2,3,5,53,677,929},MOD=1000003471;
const int N=1e4+5;
ll C[N][N];
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int Lucas(int n,int m,int p)
{
for (int i=0;i<p;i++)
{
C[i][0]=1;
for (int j=1;j<=i;j++)
{
C[i][j]=C[i-1][j-1]+C[i-1][j];
if (C[i][j]>=p) C[i][j]-=p;
}
} // init
int ans=1;
while (n||m){ans=ans*C[n%p][m%p]; n/=p; m/=p;}
return ans;
}
ll qpow(ll x,ll n,ll p)
{
ll ans=1;
while (n)
{
if (n&1) ans=ans*x%p;
n>>=1; x=x*x%p;
} return ans;
}
int x,n,m;
ll M=1000003470,ans=0;
int main()
{
scanf("%d%d%d",&x,&n,&m);
for (int i=0;i<6;i++)
{
ll Q=List[i],P=Lucas(n,m,Q);
ans+=P*(M/Q)%M*qpow(M/Q,Q-2,Q)%M;
} printf("%lld\n",qpow(x,ans,MOD)%MOD);
return 0;
}

T4 80pts(应该没人想看这里)

using namespace std;
typedef long long ll;
const int MOD=1e9+7,N=2050;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll n,a[N],x=1;
int main()
{
scanf("%lld",&n);
for (int i=1;i<=n;i++) scanf("%lld",a+i),x=lcm(x,a[i]);
for (ll D=a[1];D<=1e9;D+=a[1])
{
bool vis=true;
if (D+n-1>1e9) continue;
for (ll now=D+1;now<=D+n-1;now++)
if (now%a[now-D+1]){vis=false; break;}
if (vis){printf("%lld %lld\n",x,D); return 0;}
} printf("stO zhx Orz");
return 0;
}
// 4 3 2

T4

using namespace std;
typedef long long ll;
const int N=2050;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll n,a[N],p,q,x=1;
void merge(ll& a1,ll& m1,ll a2,ll m2)
{
if (m2>m1) swap(m1,m2),swap(a1,a2);
while (a1%m2!=a2) a1+=m1;
m1=lcm(m1,m2);
}
int main()
{
scanf("%lld",&n);
for (int i=1;i<=n;i++) scanf("%lld",a+i),x=lcm(x,a[i]);
p=0; q=1;
for (int i=1;i<=n;i++)
{
int P=((1-i)%a[i]+a[i])%a[i],Q=a[i];
merge(p,q,P,Q);
} printf("%lld %lld",x,p);
return 0;
}

qbxt五一数学Day3的更多相关文章

  1. qbxt五一数学Day2

    目录 1. 判断素数(素性测试) 1. \(O(\sqrt n)\) 试除 2. Miller-Rabin 素性测试 * 欧拉函数 2. 逆元 3. exgcd(扩展欧几里得) 4. 离散对数(BSG ...

  2. qbxt五一数学Day1

    目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...

  3. 【qbxt五一】day2

    简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...

  4. Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)

    选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...

  5. Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评

    新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...

  6. 【五一qbxt】day3 动态规划

    动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...

  7. qbxt数学五一Day4

    目录 1. 随机试验 2. 概率 1. 平凡 2. 条件概率 3. 期望 习题 1 2 3 4 1. 随机试验 定义: 不能预先确知结果 试验之前可以预测所有可能结果或范围 可以在相同条件下重复实验 ...

  8. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  9. qbxt Day3 on 2019-8-18

    qbxt Day3 on 2019-8-18 一.基础数论 1.进制转换 进制转换是一个非常简单且基础的问题. 也许我们只需要...Emmm... 列个式子就好了鸭 设\(k\)进制数每一位上是\(a ...

随机推荐

  1. 现有教学数据库JX_DB,作业

    现有教学数据库JX_DB,数据库有以下三个基本表: 学生表student,它由学号sno.姓名sname.性别sex.出生日期Bdate.所在系dept五个属性构成.其中,学号不能为空,值是唯一的: ...

  2. PTA 7-4 堆栈操作合法性 (20 分)

    假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...

  3. 【mq】从零开始实现 mq-10-消费者拉取消息回执 pull message ack

    前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...

  4. 管家婆软件工贸版(标准财务+进销存+生产管理)V18.0功能简介

    管家婆软件工贸版(标准财务+进销存+生产管理)V18.0功能简介 管家婆 工贸版(标准财务+进销存+生产管理) 1.整体介绍 管家婆工贸版系列软件是针对国内中小型生产加工企业,将ERP管理思想与几十万 ...

  5. 利用apache ftpserver搭建ftp服务器

    操作环境: win2012r2 x64 datacenter Apache FtpServer 1.2.0 Java SE Development Kit 8u333 commons-dbcp2-2. ...

  6. 好客租房32-事件绑定this指向(class实例方法)

    class实例方法 利用箭头函数的class实例方法 //导入react import React from 'react'   import ReactDOM from 'react-dom' // ...

  7. Sentinel介绍与使用 收藏起来

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 前言 在家休息的的时候,突然小勇打 ...

  8. L2M-GAN: Learning to Manipulate Latent Space Semantics for Facial Attribute Editing阅读笔记

    L2M-GAN: Learning to Manipulate Latent Space Semantics for Facial Attribute Editing 2021 CVPR L2M-GA ...

  9. Fail2ban 配置详解 基础配置(fail2ban.conf)

    [Definition] loglevel = INFO # 设置日志级别:级别越低显示日志的信息更详细. # CRITICAL - 关键级别 # ERROR - 错误级别 # WARNING - 警 ...

  10. 史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)

    能够实现Nacos安装 基于Nacos能实现应用负载均衡 能基于Nacos实现配置管理 配置管理 负载均衡 多环境切换 配置共享 配置刷新 灰度发布 掌握Nacos集群部署 1 Nacos安装 Nac ...