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 ...
随机推荐
- c++ :STL
基础知识 容器 容器就是一些模板类的集合,不同之处就是容器中封装的是数据结构 1.序列容器 主要有vector向量容器.list列表容器.deque双端队列容器 元素在容器中是无序的 2.排序容器 包 ...
- 使用VPLS跨地域多站点建立二层交换网络
VLL解决方案 https://www.cnblogs.com/darkchen/p/14652540.html 接上篇文档引出VPLS VLL可以跨地域建立二层交换网络,但有个缺陷是只支持两个sit ...
- 12┃音视频直播系统之 WebRTC 实现1对1直播系统实战
一.搭建 Web 服务器 前面我们已经实现过,但是没有详细说HTTPS服务 首先需要引入了 express 库,它的功能非常强大,用它来实现 Web 服务器非常方便 同时还需要引入 HTTPS 服务, ...
- 每天一个 HTTP 状态码 100
100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...
- 【AC自动机】背单词
题意: 0 s v:添加价值为v的字符串s 1 t:查询t中含的s的权值和.(不停位置算多次) 思路: 在线AC自动机. 同学用过一个妙妙子的分块算法. 这里用二进制分组:通常用作把在线数据结构问题转 ...
- C++:接送旅客
接送旅客 时间限制:1.00sec 内存限制:128MB 题目描述: 现在,你是一家酒店的员工,你需要帮助这家酒店的旅客运送行李离开酒店.现在,你送顶层开始往下移动,为了减少电梯移动的距 ...
- git bisect:让你闭眼都能定位疑难 bug的利器
摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误.它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用. 本文分享自华为云社区<利用好 git bisec ...
- vscode的一些优化设置
@ 目录 编辑代码区的字体设置 控制台字体设置 设置文件自动保存 自动猜测文件编码,防止乱码 关闭vscode的受限模式 取消每一次打开vscode都默认打开上次编辑的文件 编辑代码区的字体设置 控制 ...
- .net core 抛异常对性能影响的求证之路
一.前言 在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问.项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题. 查阅了各种文档,微软官 ...
- SAP Column tree
code as bellow *&---------------------------------------------------------------------* *& I ...