Day 1:6-28(+3)
第一天,发现从哪里开始学都要纠结一阵......dp?图论?搜索?发现过了许久有点一下子啃不动 qwq
便先从最基础的算法开始学吧。
今天貌似只复习了快速幂......(悲
(1) 快速幂、快速乘、龟速乘
快速幂
ll quickpow(ll a, ll b, ll p)
{
ll ans = 1 % p;
while (b)
{
if (b & 1) ans = (ans * a) % p;
a = (a * a) % p;
b >>= 1;
}
return ans;
}
快速乘
ull quicktimes(ull a, ull b, ull p)
{
ull ans = 0;
while(b)
{
if(b & 1) ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans ;
}
龟速乘
ll quick_mul(ll a, ll b, ll p)
{
ll res = 0;
while(b)
{
if(b & 1) res = (res + a) % p;
a = (a + a) % p;
b >>= 1;
}
return res;
}
ll quick_pow(ll a, ll b, ll p)
{
ll ans = 1 % p;
while(b)
{
if(b & 1) ans = quick_mul(ans, a, p) % p;
a = quick_mul(a, a, p) % p;
b >>= 1;
}
return ans;
}
快速幂随便写了点东西,貌似已经烂熟于心了,便自己写了思路在纸上。
快速乘也差不多,就是把两数相乘换成二进制下几个数相加。
没事又证明了一下模运算为什么可以在乘法中随便模 qwq
还有模运算也满足『结合律』『交换律』『分配律』,除法部分除外。
还有这个龟速乘,它就是防止某些zz出题人卡 longlong
的。就假如它给两个值都是 \(2^{63}-1\) 让你乘,ull
都救不了(__int128
另说,但貌似不能用
原理就是用加法替换乘法,这样就不会一下子爆了(还有 % 撑着呢
貌似时间复杂度也是 \(\log n\) ๑乛ᴗ乛๑
(2) 异或运算小tips
做这道题时意外发现两个异或有用的性质:
-
若 \(x=y\) ,\(x \bigoplus y=0\)
-
\(x \bigoplus 0=x\)