2022.2.23#杂项新大陆
2022-02-23
注定开启新大陆
快速幂:参考算法学习笔记(4):快速幂 - 知乎 (zhihu.com)
从O(N)到O(logN),巨快
递归:
//递归快速幂 int qpow(int a, int n) { if (n == 0) return 1; else if (n % 2 == 1) return qpow(a, n - 1) * a; else { int temp = qpow(a, n / 2); return temp * temp; } }
非递归:
//非递归快速幂 int qpow(int a, int n){ int ans = 1; while(n){ if(n&1) //如果n的当前末位为1 ans *= a; //ans乘上当前的a a *= a; //a自乘 n >>= 1; //n往右移一位 } return ans; }
非递归快速幂可以进行拓展,拓展到矩阵去哦!
关于数论:
真的牛批!转载自同余相关算法小结 - 知乎 (zhihu.com)
10进制下mod 1,3,9与该数各位mod 1,3,9得到的数一样。
给你一个正整数 ,每次将所有位数加起来得到一个新的数,直到新的数只有一位。输出最后的结果。
思路
以 进行举例:
如果把数按十进制展开:
每一次操作实质上是将每一位的权值(十位的10,百位的100)变成了1。
如果只是将10变成1,我们可以考虑:
- ......
但是,我们同时需要将100,1000甚至100000....都变成1,所以,只有对9取模才能达到这样的效果。
由离散数学,在这里 变成了一个等价类,只有同余关系满足自反,对称和传递性,所以才满足条件。
所以本题只需要求出该数对9取模的数就好了。
但存在一个特殊情况是: ,所以应该特判答案为0的情况。
ps:数学是一切的基础
矩阵代码运算:参考自矩阵 - OI Wiki (oi-wiki.org)
矩阵相乘:
A*B=C
for:ijk
A[i][k]
B[k][j]
C[i][j]
1 // 我常用的 2 inline mat operator*(const mat& T) const { 3 mat res; 4 for (int i = 0; i < sz; ++i) 5 for (int j = 0; j < sz; ++j) 6 for (int k = 0; k < sz; ++k) { 7 res.a[i][j] += mul(a[i][k], T.a[k][j]); 8 res.a[i][j] %= MOD; 9 } 10 return res; 11 } 12 13 // 改善方法版本 14 inline mat operator*(const mat& T) const { 15 mat res; 16 int r; 17 for (int i = 0; i < sz; ++i) 18 for (int k = 0; k < sz; ++k) { 19 r = a[i][k]; 20 for (int j = 0; j < sz; ++j) 21 res.a[i][j] += T.a[k][j] * r, res.a[i][j] %= MOD; 22 } 23 return res; 24 }

浙公网安备 33010602011771号