写代码的能力差的不止一星半点……但是大部分代码水平高的人也是经过自己的努力一步一步磨练出来的。既然自己之前没有那么辛苦的训练过,那么从现在开始,尽可能的坚持下去,希望能不断地看到自己的进步,加油!
一、斐波那契数列快速幂取模
递归太容易超时了,上数据结构讲递归的时候,老师总爱拿阶乘和斐波那契数列举例子,搞得自己现在一想起斐波那契数列就写递归,然后英勇超时……
英勇超时了还好说,改成循环嘛。改好了,然后英勇溢出,无符号longlong也救不了我……
才发现居然是用快速幂的方法……又学新知识了,万事开头难,然后中间难,最后结尾难。。
求斐波那契数列第n项模1000000007的值
具体的推理过程参考这一篇博客
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef long long LL;
const LL maxn = 1010;
const LL mod = 1000000007;
const int N = 2;
struct Matrix{
LL m[N][N];
};
//这样实现一个二维数组的确非常不错……省去了[0][0],[1][0]之类的烦扰
Matrix A = {
1,1,
1,0
};
Matrix I = {
1,0,
0,1
};
Matrix multi(Matrix a, Matrix b){
Matrix c;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
c.m[i][j] = 0;
for (int k = 0; k < 2; k++) {
c.m[i][j] += a.m[i][k]*b.m[j][k] % mod;
}
c.m[i][j] %= mod;
}
}
return c;
}
Matrix power(Matrix A, int k){
Matrix ans = I,p = A;
while (k) {
if (k&1) {
ans = multi(ans, p);
k--;
}
k>>=1;
p = multi(p, p);
}
return ans;
}
unsigned long long f(int n){
unsigned long long pre = 1,cur = 1,result = 0;
if (n == 1 || n == 2) {
return 1;
}
while (n > 2) {
n--;
result = pre + cur;
pre = cur;
cur = result;
}
return result;
}
int main()
{
int n;
cin >> n;
Matrix ans =power(A,n-1);
cout << ans.m[0][0];
return 0;
}
二、矩阵翻转
给定一个n*m的矩阵,给出顺时针旋转90°之后的矩阵。
这个题没什么意思,就是注意一下不需要先保存一个数组再进行转动,直接在输入的地方做文章就可以。
“`
include
include
include
using namespace std;
int main()
{
int maxn = 210;
int init[maxn][maxn];
int m,n;
cin >> n >> m;
for (int j = n; j >= 1; j–) {
for (int i = 1; i <= m; i++) {
cin >> init[i][j];
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (j!=n) {
cout << init[i][j] << ” “;
}else{
cout << init[i][j] << endl;
}
}
}
return 0;
}