矩阵快速幂(专门针对于斐波那契数列的模板)
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 }