思路讲解
拓展欧几里得算法
这篇题解非常好
https://www.luogu.com.cn/article/1wawrmip
线性同余方程 $ax=b \ (mod \ n) (ax)\ mod \ n=b$ x为未知数

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

的成立条件是 当然,这是一定有解的,除非a,b中有一个为0。

AC代码
1 |
|
心路历程(WA,TLE,MLE……)
需要加一个这个判断是否存在逆元
1 | if(gcd(y,p)!=1){ |
所以说才有可能求出逆元。
拓展欧几里得算法
这篇题解非常好
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> |
和这题代码基本一样,还是比较适合我复训的。
我们来解释一下为什么可以这样pushup
1 | inline void invert(ll s,ll e){ |
众所周知,我们知道差分数组是给diff[s]+1,给diff[e+1]-1,那为什么可以直接pushup那?那是因为树状数组中遍历你上面的数组是必然遍历不到你的,这点你不用担心,所以不用担心差分连续加导致出错。
https://www.luogu.com.cn/record/192393560
1 | #include <iostream> |