poj3233
給定n ,k,m
然後是n*n行,
我們先可以把式子轉化為遞推的,然後就可以用矩陣來加速計算了。 矩陣是加速遞推計算的乙個好工具
我們可以看到,矩陣的每個元素都是乙個矩陣,其實這計算乙個分塊矩陣,我們可以把分塊矩陣展開,它的乘法和普通矩陣的乘法是一樣的。
1 #include 2 #includeview code3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include
11 #include
12 #include 13
using
namespace
std;
14#pragma warning(disable:4996)
15 typedef long
long
ll;16
const
int inf = 1
<< 30;17
intmod;
18/*
19矩陣的元素是矩陣,即分塊矩陣
20分塊矩陣的乘法和普通矩陣的乘法是一樣的
21*/
22struct
matrix
2330
void
makezero()
3137}38
void
makeunit()
3945}46
};47
48 matrix operator*(const matrix &lhs, const matrix &rhs)
4962}63
}64return
ret;65}
66 matrix operator^(matrix &a, int
k)67
76 a = a *a;
77 k >>= 1;78
}79return
ret;80}
81int
main()
8299 a.mat[n + i][i] = a.mat[n + i][n + i] = 1
;100
}101 a = a ^ (k - 1
);102 matrix ans(2*n);
103ans.makezero();
104 m = 2 *n;
105for (i = 0; i < n; ++i)
106115
}116
}117
for (i = 0; i < n; ++i)
118123
}124
}125
return0;
126 }
當然了,我們還可以用二分的方法方法來計算
19矩陣的元素是矩陣,即分塊矩陣
20分塊矩陣的乘法和普通矩陣的乘法是一樣的
21*/
22struct
matrix
2330
void
makezero()
3137}38
void
makeunit()
3945}46
};47
48 matrix operator*(const matrix &lhs, const matrix &rhs)
4962}63
}64return
ret;65}
66 matrix operator^(matrix &a, int
k)67
76 a = a *a;
77 k >>= 1;78
}79return
ret;80}
81 matrix operator+(const matrix &lhs, const matrix &rhs)
8293}94
return
ret;95}
96 matrix matrixsum(matrix a, int
k)97
106else
107111
return
ret;
112}
113int
main()
114127
}128 matrix ans =matrixsum(a, k);
129for (i = 0; i < n; ++i)
130134
return0;
135}
136 }
view code
poj 3233 矩陣快速冪
十個利用矩陣乘法解決的經典題目的最後一題 1a終於刷完十道題了,基本都是乙個思路 二分優化!a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 用二分變成 a 1 a 2 a 3 a 4 a 4 a 1 a 2 a 3 a 4 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a ...
poj 3233 矩陣高速冪
題意 給出乙個公式求這個式子模m的解 分析 本題就是給的矩陣,所以非常顯然是矩陣高速冪,但有一點。本題k的值非常大。所以要用二分求和來降低執行時間。include include include include include include include include include incl...
POJ 3233 矩陣快速冪 二分
題意 給你乙個n n的矩陣 讓你求s 思路 只知道矩陣快速冪 然後nlogn遞推是會tle的。所以呢 要把那個n換成log 那這個怎麼搞呢 二分!當k為偶數時 當k為奇數時 就按照這麼搞就能搞出來了 我是看的題解才a的,中間亂搞的時候犯了一些腦殘的錯誤 by siriusren include in...