本文内容:同余,剩余类,完全剩余系,同余最短路,乘法逆元,笛卡尔积,既约剩余系,完全余数集合,欧拉函数及其性质,Lucas 定理。
本文及以后所设的字母,若无特殊约定,均为整数或正整数。
同余
若两个整数 和 满足 能够被正整数 整除,即 ,那么就称整数 与 对模 同余,记作
:
a \equiv b \pmod m
。
如果它们都是正数,那么上面的式子等价于 与 分别用 去除,余数相同。
举例:
剩余类
对于一个整数 ,可以把所有整数分成 类,每类中的元素对于 都同余。每一类都叫做 的一个剩余类。
比如 ,有 个剩余类,对 同余的有 。
:
\{-5,0,5,\dots\}
。
完全剩余系
从 的每个剩余类中任抽出一个数组成的集合,称为 的完全剩余系。
比如 ,它的一个完全剩余系是:。
同余最短路
问题:给定 ,, ,,求出有多少 可以使等式
存在非负整数解。
:
a_{1\dots n}
b\in[l,r]
\sum_{i=1}^n a_ix_i=b
。
解:考虑如何不重不漏地统计所有可能的 。
取任意一个 ,若某个 合法,则 一定可表示为 ()。
得到一个合法的 后,在数轴上每次后移周期 ,都是合法的。
故通过 ,利用 的完全剩余系 对 进行分类,分为 类。
令 ,我们关心的是从 开始,第一个与 对模 同余的位置,即由 号节点出发到 号节点的最短路。求得这个,即可直接计算出答案。
#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
typedef long long ll;
const ll N=1000000+10;
const ll inf=2147483647999999999;
queue<ll>q;
ll n,l,r,a[20],dis[N],vis[N],ans=0;
void spfa()
{
q.push(0);
dis[0]=0;
vis[0]=1;
while(!q.empty())
{
ll now=q.front();
q.pop();
vis[now]=0;
for(ll i=1;i<=n;i++)
{
ll to=(dis[now]+a[i])%a[1];
if(dis[to]>dis[now]+a[i])
{
dis[to]=dis[now]+a[i];
if(!vis[to])
{
q.push(to);
vis[to]=1;
}
}
}
}
}
ll query(ll x)
{
ll ret=0;
for(ll i=0;i<=a[1]-1;i++)
if(dis[i]<=x)
ret+=(x-dis[i])/a[1]+1;
return ret;
}
void main()
{
scanf("%lld%lld%lld",&n,&l,&r);
for(ll i=1;i<=n;i++) scanf("%lld",a+i);
for(ll i=0;i<=a[1]-1;i++) dis[i]=inf;
spfa();
printf("%lld\n",query(r)-query(l-1));
return;
}
}
int main()
{
_yz::main();
return 0;
}
乘法逆元
若 ,, 满足:
则 是 的模 乘法逆元(又称为数论倒数),记为 ,且 是 的模 乘法逆元,记为 ,即乘法逆元是相互的。
显然当且仅当 时, 存在逆元。
显然若 ,则 (乘法逆元是相互的)。
:
a^{-1}\pmod m
。
求法
为素数,且 ,费马小定理可求。
仅满足 ,exgcd 求解同余方程。
求小于素数 的所有数的模 的乘法逆元,线性递推求。
笛卡尔积
两个集合 和 的笛卡尔积,又称直积,表示为 。
则 。其中 为有序对。
如,。
既约剩余系
若 是 的完全剩余系,则集合 是 的既约剩余系。
完全余数集合
若 是 的既约剩余系,且 ,有 ,则 是 的完全余数集合。
显然,。
欧拉函数及其性质
:对于一个正整数 ,小于 且和 互质的正整数的个数。是积性函数。
积性证明
设 (简写为 );,, 的完全余数集合是 ,,。
显然,存在映射 ,设 ,则其映射 。
为了对像我一样的蒟蒻友好一点,给一点提示。结合下式即可易得:
。
注:若从集合的观点看这些数,把这些数看作一些质因子的集合,那么上面那些式子也是显然的。
显然,存在逆映射 。
提示:中国剩余定理(CRT)对于解的存在性判断和解的分布。
所以, 与 间存在双射,。
易知,,且 。
于是,我们得到 。
一些式子
- 本式为欧拉函数公式。
- 其中, 是 的质因子, 为 质因子个数。
- 特殊地,。
- 公式可由积性函数性质或者容斥原理求得。
- 其中 为质数。显然。
- 其中 为奇数。显然。
- 其中 为质数,。
- 显然。可认为是数轴上每隔上 个数就挖去一个数,剩下的都互质。
- 其中若 , 的质因子集合为 和 ,则满足 。
- 结合欧拉函数公式易得。
- 其中 为所有小于 ,且与 互质的数的和。
- 根据若 ,则 这一结论易得。
证明待填坑。
Lucas 定理
设 为素数,,并且
这里 ,且都为整数(把 , 表示为 进制数),。则有:
引理:。
变式:
代码:
#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
typedef long long ll;
const ll N=200000+10;
ll n,m,p,mul[N],inv[N];
void init()
{
mul[0]=mul[1]=1;
for(ll i=2;i<=n+m;i++)
mul[i]=mul[i-1]*i%p;
inv[1]=1;
for(ll i=2;i<=p-1;i++)
inv[i]=((-p/i*inv[p%i])%p+p)%p;
return;
}
ll C(ll n,ll m)
{
if(n<m) return 0;
return mul[n]*inv[mul[m]*mul[n-m]%p]%p;
}
ll Lucas(ll n,ll m,ll p)
{
if(m==0) return 1;
return C(n%p,m%p)*Lucas(n/p,m/p,p)%p;
}
void main()
{
ll T;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&m,&p);
init();
printf("%lld\n",Lucas(n+m,n,p));
}
return;
}
}
int main()
{
_yz::main();
return 0;
}
本文作者:Yurchiu
本文链接:https://yz-hs.github.io/751001810ff0/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。