思路讲解

由于p给你的一般是素数,一般不用担心b,p互素的问题,除非b%p=0
AC代码
https://www.luogu.com.cn/record/192866597
1 |
|

由于p给你的一般是素数,一般不用担心b,p互素的问题,除非b%p=0
https://www.luogu.com.cn/record/192866597
1 | #include <iostream> |
拓展欧几里得算法
这篇题解非常好
https://www.luogu.com.cn/article/1wawrmip
线性同余方程 $ax=b \ (mod \ n) 的意思是指(ax)\ mod \ n=b$ x为未知数

那这个线性同余方程方程可以转换为什么方便我们求解那?

a∗x=1(mod b)的成立条件是gcd(a,b)∣1 (a,b的最大公约数整除1) 当然,这是一定有解的,除非a,b中有一个为0。

x∗y=1(mod p) −>x_∗y+y_∗p=gcd(y,p)
1 | #include <iostream> |
需要加一个这个判断是否存在逆元
1 | if(gcd(y,p)!=1){ |
(x∗y) mod p=1 −>(x mod p)∗(y mod p)=1
所以说y mod p=1才有可能求出逆元x。
因为(a, b)= (b, a mod b) 【()表示最大公约数】


也可以这么写
1 | void Exgcd(ll a, ll b, ll &x, ll &y) { |
https://www.acwing.com/problem/content/submission/879/
1 | #include <iostream> |
需要综合计量一个分割点的价值。之前迟迟无法AC就是这个原因。
Call.push_back(Cnt1[i]-Cnt0[i]);
一个分割可以产生的相差值就是Cnt1[i]−Cnt0[i],我们把所有分割点产生的相差值push进这个Call里
然后最后sort一下,贪心的减少,统计数量即可。
1 | sort(Call.begin(), Call.end()); |
https://codeforces.com/contest/2042/submission/294590561
1 | #include <iostream> |
之前一直无法AC就是因为没发现一个点产生的不同值
idxrare指出现次数最少的,idxmost指出现次数最多的字母
A[idxrare]=A[idxmost];
然后好了。
多用sort啦,宁愿多耗点空间,这样能够确保你的意志能够被准确地执行
唉,前面在遍历的时候瞎搞,唉。
https://codeforces.com/contest/2047/submission/294578039
1 | #include <iostream> |
暴力(当然,会超时)
注意next_permutation()如果想遍历全部的话需要sort一下啦。
1 | #include <iostream> |