礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\) 注意到若\[p=\prod_{i=1}^{k}{p_i}^{c_i},则\forall i\in [1..k]{p_i}^{c_i}\le 10^5.\] 于是有一个经典套路就是,求出\(k\)组\(A_i=C(n,m)\% {p_i}^{c_i}\)…
题意:给出 A%9973 和 B,求(A/B)%9973的值. 解法:拓展欧几里德求逆元.由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元. 对于 B-1,P为模数9973,那么 B*B-1=1(mod P)  →  把 B-1 看成 x ,就是 Bx+Py=1.也就是求不定方程的解了.x 就是 B-1,答案就是 ((A%9973)*(x%9973))%9973 . P.S.关于拓展欧几里德求解不定方程的具体解释请见--[poj 2115]C L…
当模数为素数时可以用费马小定理求逆元. 模数为合数时,费马小定理大部分情况下失效,此时,只有与模数互质的数才有逆元(满足费马小定理的合数叫伪素数,讨论这个问题就需要新开一个博客了). (对于一个数n,所有小于它且与它互质的数组成一个模n乘法群) gcd是最大公约数,扩展gcd则是在一对数x,y的gcd后,给出一组解a,b,使得 a*x+b*y=gcd(x,y) 不难看出,如果将y是模数,并且x与y的gcd为1时 a*x+b*y=1 a*x % y=1 根据逆元的定义,此时a就是x的模y逆元. i…
void gcd(LL a,LL b,LL &d,LL &x,LL &y){ ){d=a;x=;y=;return;} gcd(b,a%b,d,x,y); int t=x; x=y; y=t-a/b*x; return; } LL t(LL a,LL b,LL c,LL &x,LL &y ){//解ax+by=c的方程 LL d;gcd(a,b,d,x,y); ;//c%gcd(a,b)若不为0,则无解 //将x调成最小正整数,下面顺序不能乱 LL ran=b/d;…
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x*y/gcd(x,y); } 2.扩欧:exgcd:对于a,b,一定存在整数对(x,y)使ax+by=gcd(a,b)=d ,且a,b互质时,d=1. x,y可递归地求得. 我懒得改返回值类型了 long long exgcd(long long a,long long b,long long &x,…
题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出满足 (1) X^A = B(mod 2*K + 1) (2) X 在范围[0, 2K] 内的X的个数!自然数论之神是可以瞬间秒杀此题的,那么你呢? 输入 第一行有一个正整数T,表示接下来的数据的组数( T <= 1000) 之后对于每组数据,给出了3个整数A,B,K (1 <= A, B <…
今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$有一个微小的要求,就是$\forall i,j (m_i,m_j)=1$. 在某些情况下,这个式子无法被满足,这个时候就要用扩展$CRT$来求解了. 我们先假设我们只有两条方程要被求解,它们分别是: $\begin{cases} x\equiv c_1 \pmod{m_1}\\x\equiv c_2…
题目链接:codeforces 492e vanya and field 留个扩展gcd求逆元的板子. 设i,j为每颗苹果树的位置,因为gcd(n,dx) = 1,gcd(n,dy) = 1,所以当走了n步后,x从0~n-1,y从0~n-1都访问过,但x,y不相同. 所以,x肯定要经过0点,所以我只需要求y点就可以了. i,j为每颗苹果树的位置,设在经过了a步后,i到达了0,j到达了M. 则有 1----------------------(i + b * dx) % n = 0 2------…
gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗转相除法输进去时 a 要大于 b ,现在发现事实上如果 a 小于 b,那第一次就会先交换 a 与 b. #include<stdio.h> #define ll long long ll gcd(ll a,ll b){ ?a:gcd(b,a%b); } int main(){ ll a,b; wh…
int exgcd(int a,int b,int &x,int &y) { ) { x=,y=; return a; } int gcd=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return gcd; } int China(int W[],int B[],int k) { ,m,n=; ;i<=k;i++) n*=W[i]; ;i<=k;i++) { m=n/W[i]; exgcd(W[i],m,x,y); a=(a+y*m*B…