qbxt五一数学Day3
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\),则:
\]
由于 \(x<p\) 且 \(p\) 是素数,所以 \(x\) 存在模 \(p\) 意义下的逆元,因此:
\]
因为 \(p\cdot x^{-1}\cdot C^{x-1}_{p-1}\equiv 0\pmod p\) ,故 \(C^x_p\equiv0\pmod p\).
由二项式定理,
\]
除了 \(i=0,i=p\) 的项数,别的模 \(p\) 均为 \(0\),所以:
\]
现在我们设:
\]
从而:
\]
再由二项式定理有
\]
而同时又有:
\]
注意到 \(ip+j\) 正好能取到 \(0\) 到 \(m\) 内所有整数一次,所以枚举 \(k=ip+j\),得
\]
结合二项式定理,得
\]
对比系数,得:
\]
命题获证 .
4. \(n,m\le 10^6\),\(p=p_1p_2\cdots p_k\),\(p_1,p_2,\cdots,p_k\le 2000\) 为互不相同的素数
令
\]
则
\]
用 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\) 夫妻问题固定每个夫妻,用容斥原理:
\]
小题
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\) .
乱构造
\]
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\) 为任意整数
令
\]
然后矩阵快速幂优化,时间复杂度 \(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的更多相关文章
- qbxt五一数学Day2
目录 1. 判断素数(素性测试) 1. \(O(\sqrt n)\) 试除 2. Miller-Rabin 素性测试 * 欧拉函数 2. 逆元 3. exgcd(扩展欧几里得) 4. 离散对数(BSG ...
- qbxt五一数学Day1
目录 I. 基础知识 1. 带余除法(小学) 1. 定义 2. 性质 2. 最大公约数(gcd)/ 最小公倍数(lcm) 1. 定义 2. 性质 3. 高精度 II. 矩阵及其应用 1. 定义 2. ...
- 【qbxt五一】day2
简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...
- Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)
选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...
- Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评
新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...
- 【五一qbxt】day3 动态规划
动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...
- qbxt数学五一Day4
目录 1. 随机试验 2. 概率 1. 平凡 2. 条件概率 3. 期望 习题 1 2 3 4 1. 随机试验 定义: 不能预先确知结果 试验之前可以预测所有可能结果或范围 可以在相同条件下重复实验 ...
- 【五一qbxt】day7-2 选择客栈
停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...
- qbxt Day3 on 2019-8-18
qbxt Day3 on 2019-8-18 一.基础数论 1.进制转换 进制转换是一个非常简单且基础的问题. 也许我们只需要...Emmm... 列个式子就好了鸭 设\(k\)进制数每一位上是\(a ...
随机推荐
- VMware服务关闭后一定要重启
重要的事情说三遍:服务暂时关闭记得重启,服务暂时关闭记得重启,服务暂时关闭记得重启!!! VMware服务由于安装补丁的需要我暂时把服务关闭了,于是我遇到了尴尬的一幕,于是乎发现上不了网了,于是各种操 ...
- npm 是什么?
npm 是什么? 本文写于 2020 年 6 月 16 日 最近帮几个同学装开发环境,发现他们会各种"卡死"在 npm 安装一些包的过程中. 他们会非常纠结这个命令我明明敲的和网上 ...
- 【freertos】009-任务控制
目录 前言 9.1 相对延时 9.1.1 函数原型 9.1.2 函数说明 9.1.3 参考例子 9.2 绝对延时 9.2.1 函数原型 9.2.2 函数说明 9.2.3 参考例子 9.3 获取任务优先 ...
- Docker打包镜像并上传
Docker打包镜像并上传 登录 账号 docker login --username=yourusername 密码 yourPassword 推送到仓库 docker镜像打标签 docker ta ...
- Python3 collections模块
https://www.cnblogs.com/zhangxinqi/p/7921941.html http://www.wjhsh.net/meng-wei-zhi-p-8259022.html h ...
- CAP 6.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性. 那么,接下来我们具体看一下吧. 总览 可能有些人还不知 ...
- Vue数据双向绑定原理(vue2向vue3的过渡)
众所周知,Vue的两大重要概念: 数据驱动 组件系统 1 2 接下来我们浅析数据双向绑定的原理 一.vue2 1.认识defineProperty vue2中的双向绑定是基于definePropert ...
- hadoop集群搭建——单节点(伪分布式)
1. 准备工作: 前提:需要电脑安装VM,且VM上安装一个Linux系统 注意:本人是在学习完尚学堂视频后,结合自己的理解,在这里做的总结.学习的视频是:大数据. 为了区分是在哪一台机器做的操作,eg ...
- ssh空闲一段时间后自动断网
ssh空闲一段时间后自动断网 用客户端工具,例如securecrt连接linux服务器,有的会出现过一段时间没有任何操作,客户端与服务器就断开了连接. 造成这个的原因,主要是因为客户端与服务器之间存在 ...
- React技巧之导入组件
正文从这开始~ 总览 在React中,从其他文件中导入组件: 从A文件中导出组件.比如说,export function Button() {} . 在B文件中导入组件.比如说,import {But ...