qbxt五一数学Day3
1. 组合数取模
求
1. , 任意
递推
2. , 素数
预处理 ,, 即可 .
3. , 素数
注意到 可能是 的倍数,故逆元可能不存在 .
引入 Lucas 定理:
设 在 ( 是质数)进制下表示为
其中 , .
则有:
Proof:
原问题等价于 .
设 ,且 ,则:
由于 且 是素数,所以 存在模 意义下的逆元,因此:
因为 ,故 .
由二项式定理,
除了 的项数,别的模 均为 ,所以:
现在我们设:
从而:
再由二项式定理有
而同时又有:
注意到 正好能取到 到 内所有整数一次,所以枚举 ,得
结合二项式定理,得
对比系数,得:
命题获证 .
4. ,, 为互不相同的素数
令
则
用 Lucas 定理求组合数,然后 CRT 合并即可
2. 抽屉原理,容斥原理
1. 抽屉原理
抽屉原理:
个物品放入 个抽屉,必有一抽屉至少有两个物品 .
2. 容斥原理
典型题: 夫妻问题
对夫妻排成一圈,共 人,夫妻不能相邻,求方案数 .
前置:圆排列
个人排成一圈,方案数为 (旋转算一种)(所以去除 )
对 夫妻问题固定每个夫妻,用容斥原理:
小题
1. 组合数问题
请你把 拆成 个不同的组合数之和,输出任意一种方案
两个组合数 不同当且仅当 或
, .
乱构造
2. 组合数问题
个不同(不同的定义同上题)的组合数,求它们和的最大值 .
对于选取的组合数 要求
, .
用一个堆维护最值,每次加入杨辉三角形中四周的组合数即可 .
比较两个组合数取对数即可 .
3. 组合数问题
求
注意到对组合数作 次展开可以得到一个引理
Lemma
为任意整数
令
然后矩阵快速幂优化,时间复杂度 .
4. 万圣节
给定 个数,找若干个数使得它们是 的倍数 .
前缀和
5. 正方形
给定平面上 点,用三个 正方形覆盖所有点,求最小的 .
二分 ,判定就是两个正方形都放在角上,剩下一个再判定
下午比赛
380 pts 混了个 rank1 .
T1
给定 ,求 .
有手就行
T2
大小为 的方格图,你需要用有种颜色的大小为 和 的小方块去覆盖整个方格图。小方块和小方块之间不能互相覆盖,并且必须将整个方格图全部覆盖。求有多少种覆盖方格图的方法。两种方案不一样当且仅当存在某个位置颜色不一样或者摆放小方块的方法不一样。
.
推(?)个式子,然后矩乘优化
T3
求
.
欧拉降幂,对模数质因数分解,Lucas 定理求然后 CRT 合并
T4
给定 个数,其中第 个数为 . 求任意一组可能的 的值 .
,保证存在答案 .
考场上胡了个 暴力,80pts .
显然 .
用 列出同余方程,CRT 解出 即可 .
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;
}
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/14728125.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-05-03 浅谈前缀和
2020-05-03 浅谈 LCA