矩阵快速幂?递归取模?
//超时解法:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstdlib> #include<string> #include<cmath> #include<ctype.h> #include<climits> #include<vector> #include<map> #include<set> #include<queue> #include<functional> #define stop while(1); #define lowbit(x) (x&(-x)) #define eps (1e-8) #define pi (acos(-1.0)) #define maxint INT_MAX #define maxlong 0xFFFFFFFFFFFFFFFLL using namespace std; typedef unsigned long long u64; int a, b; int solve(int n) { if (n == 1 || n == 2) return 1; else return (a * solve(n - 1) + b * solve(n - 2)) % 7; } int main () { int m, p, n; while (cin >> m >> n >> p) { if (!m && !n && !p) return 0; a = m; b = n; int ans = solve(p) % 7; cout << ans << endl; } }
没事少用递归一般都会超时
//矩阵快速幂:
//想不到(不会。。。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int bc=2; const int mod = 7; struct matrix { int x[bc][bc]; }; matrix mutimatrix(matrix a,matrix b) { matrix temp; memset(temp.x,0,sizeof(temp.x)); for(int i=0;i<bc;i++) //答案的行 { for(int j=0;j<bc;j++) //答案的列 { for(int k=0;k<bc;k++) { temp.x[i][j]+=a.x[i][k]*b.x[k][j]; temp.x[i][j]%=mod; } } } return temp; } matrix powmatrix(matrix a,int b) { matrix temp; memset(temp.x,0,sizeof(temp.x)); //初始化矩阵为单位阵 for(int i=0;i<bc;i++) temp.x[i][i]=1; while(b) { if(b%2==1) temp=mutimatrix(temp,a); a=mutimatrix(a,a); b=b/2; } return temp; } int main() { int a,b,n; //freopen("in.txt","r",stdin); while(scanf("%d %d %d",&a,&b,&n)!=EOF) { if(a==0&&b==0&&n==0) break; matrix st; //因为每次都是a个F(n-1)和b个F(n-2)相加,所以这里如此初始化 //Fib数列这里就直接单位阵 st.x[0][0]=a; st.x[0][1]=1; st.x[1][0]=b; st.x[1][1]=0; st=powmatrix(st,n-1); printf("%d ",(st.x[0][1]+st.x[1][1])%mod); } return 0; }
神仙解法(时间和空间的高度优化)
// 取模的题一般都有规律 // 二阶的话周期为49 #include <iostream> using namespace std; int arr[50]; int main() { int n, a, b; arr[1] = arr[2] = 1; while (cin >> a >> b >> n) { if (a == 0 && b == 0 && n == 0) break; int minn = n < 50 ? n : 50;//一个小小的优化 for (int i = 3; i <= minn; i++) { arr[i] = (a * arr[i - 1] + b * arr[i - 2]) % 7; } cout << arr[n % 49] << endl; } return 0; }