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 }

 

 

posted @ 2022-02-24 01:04  Tiachi  阅读(46)  评论(0)    收藏  举报