问题描述
如果你还没有看过研究兔子的土豪,那么请你先去看那道题。
HWD老师研究兔子时的某天,他突然不幸的发作了他的密集恐惧症,于是只能放了他的所有兔子……然后,他还是想去研究兔子,于是捡回了他那个伟大的笼子,又买了许多兔子……他依旧开始研究,发现这两批兔子的繁衍规律完全相同……他就这么让兔子繁衍着,直到某天,他怕他的密集恐惧症重新发作,于是,他又找到了那个雇主,但这个雇主的强迫症加重了,他只每次收购10^9+7只兔子,HWD老师再次尽量多的卖出了他已久的兔子,再次数着剩下陪伴他的它们……
后来,HWD老师知道了两次收购他兔子的那个人其实叫LZH……
HWD老师研究兔子时的某天,他突然不幸的发作了他的密集恐惧症,于是只能放了他的所有兔子……然后,他还是想去研究兔子,于是捡回了他那个伟大的笼子,又买了许多兔子……他依旧开始研究,发现这两批兔子的繁衍规律完全相同……他就这么让兔子繁衍着,直到某天,他怕他的密集恐惧症重新发作,于是,他又找到了那个雇主,但这个雇主的强迫症加重了,他只每次收购10^9+7只兔子,HWD老师再次尽量多的卖出了他已久的兔子,再次数着剩下陪伴他的它们……
后来,HWD老师知道了两次收购他兔子的那个人其实叫LZH……
输入格式
HWD老师让兔子繁衍了几代(一个整数,没有其他字符)。
输出格式
HWD老师剩余(残余?)的兔子(一个整数,忽略行尾回车及空格)。
样例输入
1
样例输出
1
数据规模和约定
兔子的总量最大时小于HWD老师笼子的大小。
f[1]=1,f[2]=1,f[3]=2 ……
f[1]=1,f[2]=1,f[3]=2 ……
这又是一件悲伤的故事。
这是这道题https://www.cnblogs.com/fx1998/p/12712789.html的数据强化版,需要再配合矩阵快速幂。
然后然后在把以前的矩阵快速幂模板拿过来改了改发现又出错了,然后然后又从头复习了一遍矩阵快速幂,然后然后一点一点的debug。
然后然后发现又又又是取模的细节操作错了。
得出结论:矩阵快速幂还是不熟练。
AC代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int p = 1000000007; 4 typedef long long ll; 5 struct Mat { 6 ll m[2][2]; 7 } ans, base; //ans为答案矩阵, base为需要求次方的矩阵 8 Mat Mul(Mat x, Mat y) { //返回矩阵x乘以矩阵y的矩阵 9 Mat c; 10 for (int i = 0; i < 2; i++) { 11 for (int j = 0; j < 2; j++) { 12 c.m[i][j] = 0; 13 for (int k = 0; k < 2; k++) { 14 c.m[i][j] += (x.m[i][k] % p * y.m[k][j] % p) % p; 15 } 16 } 17 } 18 return c; 19 } 20 void quick_pow(ll n) { //求base的n-1次方 21 while (n) { //同一般的快速幂 22 if (n & 1) { 23 ans = Mul(ans, base); 24 } 25 base = Mul(base, base); 26 n >>= 1; 27 } 28 } 29 int main() { 30 ll n; 31 cin >> n; 32 n %= 2000000016; 33 ans.m[0][0] = 1, ans.m[0][1] = 0, ans.m[1][0] = 0, ans.m[1][1] = 1; //初始化ans为单位矩阵, 34 base.m[0][0] = 1, base.m[0][1] = 1, base.m[1][0] = 1, base.m[1][1] = 0; //将base初始化为要求n次幂的矩阵 35 quick_pow(n); 36 cout << ans.m[0][1] % p << endl; 37 return 0; 38 }