HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )

博客围绕一道题目展开,该题是矩阵快速幂类型,已给出递推式。解题关键在于构造转移矩阵,特别是处理 n 的 3 次方。最后给出了最终的转移矩阵和 AC 代码。

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470

Count

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 301    Accepted Submission(s): 127


Problem Description
Farmer John有n头奶牛.
某天奶牛想要数一数有多少头奶牛,以一种特殊的方式:
第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶牛是第n头,那么他的编号就是2倍的第n-2头奶牛的编号加上第n-1头奶牛的编号再加上自己当前的n的三次方为自己的编号.
现在Farmer John想知道,第n头奶牛的编号是多少,估计答案会很大,你只要输出答案对于123456789取模.
 

 

Input
第一行输入一个T,表示有T组样例
接下来T行,每行有一个正整数n,表示有n头奶牛 (n>=3)
其中,T=10^4,n<=10^18
 

 

Output
共T行,每行一个正整数表示所求的答案
 

 

Sample Input
5
3
6
9
12
15
 

 

Sample Output
31
700
7486
64651
527023
 

 

Source

 

 

解题思路:

很裸的一道矩阵快速幂的题,递推式都给出来了。

问题在于如何构造转移矩阵?也就是如何搞定 n 的3次方?

 

 

 

最终的转移矩阵:

 

AC code:

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define LL long long
 4 using namespace std;
 5 const int MAXN = 7;
 6 const LL MOD = 123456789;
 7 template<typename T, int N = 1>
 8 struct Matrix
 9 {
10     Matrix(int f = 0):n(sizeof(data[0])/sizeof(data[0][0])){
11         for(int i = 0; i < n; i++)
12             for(int j = 0; j < n; j++)
13                 data[i][j] = 0;
14         if(f)
15             for(int i = 0; i < n; i++) data[i][i] = T(1);
16     }
17 
18     Matrix operator * (const Matrix other) const{
19         Matrix<T, N> ret;
20         for(int i = 0; i < n; i++)
21             for(int j = 0; j < n; j++)
22                 for(int k = 0; k < n; k++)
23                 ret.data[i][j] = (ret.data[i][j] + data[i][k] * other.data[k][j]%MOD)%MOD;
24         return ret;
25     }
26 
27     Matrix operator + (const Matrix other) const{
28         Matrix<T, N> ret;
29         for(int i = 0; i < n; i++)
30             for(int j = 0; j < n; j++)
31             ret.data[i][j] = (data[i][j] + other[i][j])%MOD;
32         return ret;
33     }
34 
35     Matrix operator % (const LL MOD){
36         return *this;
37     }
38 
39     T data[N][N];
40     int n;
41 
42 };
43 
44 template<typename T>
45 T mul(T a, LL n, LL mod)
46 {
47     T ret(1);
48     for(; n ; n >>= 1){
49         ret = ret*(n&1 ? a:T(1)) %mod;
50         a = a*a%mod;
51     }
52     return ret;
53 }
54 
55 const LL modulu[MAXN][MAXN] = {
56     {1, 2, 1, 0, 0, 0},
57     {1, 0, 0, 0, 0, 0},
58     {0, 0, 1, 3, 3, 1},
59     {0, 0, 0, 1, 2, 1},
60     {0, 0, 0, 0, 1, 1},
61     {0, 0, 0, 0, 0, 1}
62 };
63 
64 int main()
65 {
66     std::ios::sync_with_stdio(false);
67     int T;
68     cin >> T;
69     for(LL n; T--; ){
70         cin >> n;
71         if(n <= 2){
72             cout << n << endl;
73             continue;
74         }
75         Matrix<LL, MAXN> a;
76         memcpy(a.data, modulu, sizeof(modulu));
77         a = mul(a, n-2, MOD);
78         cout << (a.data[0][0]*2 + a.data[0][1]*1 + a.data[0][2]*27 + a.data[0][3]*9 + a.data[0][4]*3 + a.data[0][5]*1)%MOD << endl;
79     }
80     return 0;
81 }
View Code

 

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值