#include<bits/stdc++.h> using namespace std; using ll = long long; const ll N = 3; ll T; ll n; long long p = 998244353; struct Node { long long m[N][N]; Node() { memset(m, 0, sizeof m); }//矩阵初始化为0的操作 Node operator*(const Node &b) const//定义矩阵乘法运算 { Node c; for (ll i = 0; i < N; i++) for (ll j = 0; j < N; j++) for (ll k = 0; k < N; k++) { c.m[i][j] = (c.m[i][j] + m[i][k] * b.m[k][j]) % p; } return c; } }; Node fun(Node a, long long b) { Node res; for (ll i = 0; i < N; i++) res.m[i][i] = 1;//构造单位矩阵res while (b) { if (b & 1) res = res * a; // 对于奇数次幂,把矩阵a乘到res上 a = a * a; b = b / 2; } return res; } Node x,y; long long fun1() { x.m[0][0] = 1; x.m[0][1] = 0; x.m[0][2] = 1; x.m[1][0] = 0; x.m[1][1] = 1; x.m[1][2] = 1; x.m[2][0] = 2; x.m[2][1] = 2; x.m[2][2] = 1;//构造 y = fun(x,n-1); cout << (y.m[0][0] + y.m[0][2] * 2)%p <<"\n"; return y.m[0][0]; } int main() { cin >> T; for(int i = 0; i< T; i++) { cin >> n; fun1(); } return 0; } 分析时间复杂度
时间: 2024-04-27 09:19:16 浏览: 95
这段代码主要是实现了一个矩阵快速幂,求出一个矩阵的n次幂,其中n是一个正整数。
时间复杂度分析:
1.矩阵乘法的时间复杂度为O(n^3),在该代码中,矩阵大小为3*3,因此矩阵乘法的时间复杂度为O(27)=O(1)。
2.矩阵快速幂的时间复杂度为O(logn),因为在每次循环中,n都会除以2,因此最多进行logn次循环。
综合以上两点,该代码的时间复杂度为O(T*logn),其中T是测试数据的组数。
相关问题
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int mod = 1e9 + 7; int main(){ int n,x; LL ans = 1; unordered_map<int,int> hash; cin >> n; while(n--){ cin >> x; for(int i = 2;i <= x/i; ++i){ while(x % i == 0){ x /= i; hash[i] ++; } } if(x > 1) hash[x] ++; } for(auto i : hash) ans = ans*(i.second + 1) % mod; cout << ans; return 0; } 这一串代码每一步都是什么意思?
这段代码是一个计算给定一组整数的因子个数之积的程序。下面是每一步的解释:
1. `#include <bits/stdc++.h>`:这是一个预处理指令,它包含了所有常用的 C++ 标准库,以便在代码中使用。
2. `using namespace std;`:这是一个命名空间声明,它允许在代码中直接使用标准库中的函数和对象,而无需使用前缀 `std::`。
3. `typedef long long LL;`:这是一个类型定义,将 `long long` 类型重命名为 `LL`,用于表示长整型。
4. `const int mod = 1e9 + 7;`:这是一个常量定义,将 `1e9 + 7` 赋值给变量 `mod`,用于取模运算。
5. `int main()`:这是程序的主函数,程序从这里开始执行。
6. `int n, x;`:定义了两个整型变量 `n` 和 `x`,用于存储输入的值。
7. `LL ans = 1;`:定义一个长整型变量 `ans`,并初始化为 1,用于存储最终的计算结果。
8. `unordered_map<int, int> hash;`:定义了一个无序哈希表 `hash`,用于记录每个数的因子及其出现次数。
9. `cin >> n;`:从标准输入读取一个整数,存储到变量 `n` 中。
10. `while (n--)`:当 `n` 不为 0 时,执行循环体。循环的目的是读取 n 个整数并计算其因子。
11. `cin >> x;`:从标准输入读取一个整数,存储到变量 `x` 中。
12. `for (int i = 2; i <= x / i; ++i)`:循环遍历从 2 到 x 的平方根之间的所有整数 i。循环的目的是找出 x 的所有因子。
13. `while (x % i == 0)`:当 x 能被 i 整除时,执行循环体。循环的目的是将 x 分解为质因数,并记录每个质因数的出现次数。
14. `x /= i;`:将 x 除以 i,更新 x 的值。
15. `hash[i]++;`:将质因数 i 的出现次数加一。
16. `if (x > 1) hash[x]++;`:如果 x 大于 1,则说明 x 是一个大于平方根的质因数,将其出现次数加一。
17. `for (auto i : hash) ans = ans * (i.second + 1) % mod;`:遍历哈希表 hash 中的所有元素,计算每个质因数的因子个数之积,并对 mod 取模。
18. `cout << ans;`:将计算结果输出到标准输出。
19. `return 0;`:返回 0,表示程序正常结束。
解释作用:#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 200; int w[MAXN], v[MAXN], dp[6000000 + 50]; void solve() { int n, sum = 0; scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &w[i]); v[i] = w[i]; sum += w[i]; } for (int i = 1; i <= n; ++i) { for (int j = sum / 2; j >= w[i]; j--) { dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } printf("%d\n", sum - 2 * dp[sum / 2]); } int main() { solve(); return 0; }
作用是指某种事物对其他事物产生的影响或效果。它可以是积极的或消极的,也可以是有意识的或无意识的。在不同的领域中,作用的概念有不同的应用。例如,在科学研究中,我们可以探究某种物质或力量对其他物质或现象产生的作用;在社会学中,我们可以研究某种文化或制度对人类行为和价值观的作用。总之,作用是描述事物之间关系和相互影响的一个概念。
阅读全文