题目链接:HDU 4990 Reading comprehension
题目给的一个程序其实就是一个公式:当N=1时 f[n]=1,当n>1时,n为奇数f[n]=2*f[n-1]+1,n为偶数f[n]=2*f[n-1]。
先不取模,计算前十个找规律。得到一个递推公式:f[n]=2*f[n-2]+f[n-1]+1
然后快速幂解决之。
给出一个神奇的网站(找数列通项):http://oeis.org/
AC代码:
#include<stdio.h> #include<string.h> #include<iostream> #define ll __int64 struct Matrix { ll m[10][10]; }; struct Matrix I,s; ll n,kmod; Matrix Mul(Matrix a,Matrix b) { Matrix c; ll i,j,k; for(i=0;i<3;i++) { for(j=0;j<3;j++) { c.m[i][j]=0; for(k=0;k<3;k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j]); c.m[i][j]%=kmod; } } } return c; } Matrix Quickpow(Matrix a,ll n) { Matrix m,b; m=a,b=I; while(n) { if(n%2) b=Mul(b,m); n/=2; m=Mul(m,m); } return b; } int main() { ll i,j; ll k,a,b; while(scanf("%I64d %I64d",&n,&kmod)!=EOF) { Matrix ans,p,q; memset(I.m,0,sizeof I.m); memset(p.m,0,sizeof p.m); memset(q.m,0,sizeof q.m); for(i=0;i<3;i++) I.m[i][i]=1; q.m[0][0]=1; q.m[0][1]=2; q.m[0][2]=1; p.m[1][0]=1; p.m[0][1]=2; p.m[1][1]=1; p.m[2][1]=1; p.m[2][2]=1; if(n==1) printf("%I64d\n",1%kmod); else if(n==2) printf("%I64d\n",2%kmod); else { ans=Quickpow(p,n-2); ans=Mul(q,ans); printf("%I64d\n",ans.m[0][1]%kmod); } } return 0; }
时间: 2024-10-25 22:04:06