模板

矩阵快速幂(专门针对于斐波那契数列的模板)

 1 __int64 fast_mod(__int64 n)    // 求 (t^n)%MOD
 2 {
 3    __int64 t[2][2] = {1, 1, 1, 0};
 4     __int64 ans[2][2] = {1, 0, 0, 1};  // 初始化为单位矩阵
 5     __int64 tmp[2][2];    //自始至终都作为矩阵乘法中的中间变量
 6 
 7     while(n)
 8     {
 9         if(n & 1)  //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t
10         {
11             for(int i = 0; i < 2; ++i)
12                 for(int j = 0; j < 2; ++j)
13                     tmp[i][j] = ans[i][j];
14             ans[0][0] = ans[1][1] = ans[0][1] = ans[1][0] = 0;  // 注意这里要都赋值成 0
15 
16             for(int i = 0; i < 2; ++i)    //  矩阵乘法
17             {
18                 for(int j = 0; j < 2; ++j)
19                 {
20                     for(int k = 0; k < 2; ++k)
21                         ans[i][j] = (ans[i][j] + tmp[i][k] * t[k][j]) % MOD;
22                 }
23             }
24         }
25 
26         //  下边要实现  t *= t 的操作,同样要先将t赋值给中间变量  tmp ,t清零,之后 t = tmp* tmp
27         for(int i = 0; i < 2; ++i)
28             for(int j = 0; j < 2; ++j)
29                 tmp[i][j] = t[i][j];
30         t[0][0] = t[1][1] = 0;
31         t[0][1] = t[1][0] = 0;
32         for(int i = 0; i < 2; ++i)
33         {
34             for(int j = 0; j < 2; ++j)
35             {
36                 for(int k = 0; k < 2; ++k)
37                     t[i][j] = (t[i][j] + tmp[i][k] * tmp[k][j]) % MOD;
38             }
39         }
40         n >>= 1;
41     }
42     return ans[0][1];
43 }

欧拉函数(小于等于N的且与N互质的数的个数)

 1 int  p[ maxn   ];
 2     long long   phi[ maxn + 1];
 3     long long i,j;
 4     for(i = 1; i <= maxn; i++)    // 初始化
 5     { p[i] = 1; phi[i] = i; }
 6     p[1] = 0;    // 1不是素数
 7     for(i = 2; i<= maxn; i++)    // 筛素数
 8     {
 9         if(p[i])
10         {
11             for(j = i * i; j <= maxn; j += i)
12             { p[j] = 0; }
13         }
14     }
15     for(i = 2; i <= maxn; i++)    // 求欧拉函数
16     {
17         if(p[i])
18         {
19             for(j = i; j <= maxn; j += i)    // 处理素因子p[i]
20             {
21                 phi[j] = phi[j] / i * (i - 1);    // 先除后乘,防止中间过程超出范围
22             }
23         }
24     }
原文地址:https://www.cnblogs.com/Tree-dream/p/5781509.html