逆元,除法同余,容斥原理笔记
逆元,除法同余,容斥原理笔记
文章目录
- 逆元,除法同余,容斥原理笔记
-
- 单个数字求逆元
- 连续数字求逆元模版
- 连续阶乘求逆元(求组合数)
- 容斥原理
-
- 互质子序列
- 硬币购物
- 播放列表的数量

单个数字求逆元
int mod;
int power(int a,int n){int ans=1;for(;n>0;n>>=1){if(n&1)ans=((long long)ans*a)%mod;a=((long long)a*a)%mod;}return ans;
}
int inv(int n,int mod){return power(n,mod-2);
}
连续数字求逆元模版
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+1;
int n,p;
int inv[N];
void build(int n){inv[1]=1;printf("1\n");for(int i=2;i<=n;i++) {inv[i]=(int)(p-(long long)inv[p%i]*(p/i)%p);printf("%d\n",inv[i]);}
}
int main(){scanf("%d %d",&n,&p);build(n);return 0;
}
连续阶乘求逆元(求组合数)
fac是求阶乘的,inv是求逆元的,inv从大到小,因为逆元是分之一,比如100的阶乘分之一,求完之后,99的阶乘分之一可以直接用100阶乘的逆元*100,因此是逆推
const int N=3e6+1;
int mod;
int fac[N],inv[N];
int power(int a,int n){int ans=1;for(;n>0