題目描述 description
給你6個數,m, a, c, x0, n, g
xn+1 = ( axn + c ) mod m,求xn
m, a, c, x0, n, g<=10^18
輸入描述 input description
一行六個數 m, a, c, x0, n, g
輸出描述 output description
輸出乙個數 xn mod g
樣例輸入 sample input
11 8 7 1 5 3
樣例輸出 sample output
2資料範圍及提示 data size & hint
int64按位相乘可以不要用高精度。
本來一開始覺得題挺簡單,轉移矩陣 a 1 xn 或者是 a c xn
0 1 c 0 1 1
結果兩個點wa了,原因資料範圍。
從大神們的blog 學到了乙個叫慢速懲罰的東西,其原理和快速冪差不多,然後再利用乘法的分配率
code
#include
using namespace std;
long long zy[3][3];
long long fz[3][3];
long long m, a, c, x0, n, g;
long long mscf(long long x,long long y)
return ans;
}int zyy(long long s1[3][3],long long s2[3][3])
; for (int i=1;i<=2;++i)
for (int
j=1;j<=2;++j)
for (int
k=1;k<=2;++k)
tmp[i][j]=(tmp[i][j]+(mscf(s1[i][k],s2[k][j])))%m;
for (int
i=1;i<=2;++i)
for (int
j=1;j<=2;++j)
s1[i][j]=tmp[i][j];
}int
ksm(long
longx)}
int main()
#include
using namespace std;
long long zy[3][3];
long long fz[3][3];
long long m, a, c, x0, n, g;
long long mscf(long long x,long long y)
return ans;
}int zyy(long long s1[3][3],long long s2[3][3])
; for (int i=1;i<=2;++i)
for (int
j=1;j<=2;++j)
for (int
k=1;k<=2;++k)
tmp[i][j]=(tmp[i][j]+(mscf(s1[i][k],s2[k][j])))%m;
for (int
i=1;i<=2;++i)
for (int
j=1;j<=2;++j)
s1[i][j]=tmp[i][j];
}int
ksm(long
longx)}
int main()
wikioi 1281 Xn數列(矩陣乘法)
矩陣真是個神奇的東西。只要搞出乙個矩陣乘法,那麼遞推式可以完美的用上快速冪,然後使複雜度降到log 真是神奇。在本題中,應該很快能得到下邊的矩陣 a,0 xn,c xn 1,c 1,1 那麼我要要乘n次,也就是說要乘n個 a,0 1,1 因為是個方陣,所以可以用快速冪 我們先用快速冪算出n個這個2 ...
codevs1281 Xn數列,矩陣乘法練習
時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 題目描述 description 給你6個數,m,a,c,x0,n,g xn 1 axn c mod m,求xn m,a,c,x0,n,g 10 18 輸入描述 input description 一行六個數 m,a...
慢速乘法和快速冪
兩者都用了二進位制的性質,慢速乘法避免了乘法爆long long 快速冪加速乘方運算 ll fast pow ll a,ll k,ll mo while k 乙個數的n次冪等於n的二進位制次冪的乘積 such as k 7 k 1 k 2 k 4 所以快速冪就是通過乘法處理出k的2進製c次冪 以加速...