Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴个8^3*lgN级的代码使用的矩阵连乘+2分幂,可以使题目中的lgN加大到10^6,N有多大不会算了 #include <stdio.h> #define LL long long #define N 8 void mult(LL a[N][N],LL b[N][N])//a*=b; { int c[N][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) {c[i][j]=0; for(int k=0;k<N;k++) c[i][j]+=a[i][k]*b[k][j]; } for(int i=0;i<N;i++) for(int j=0;j<N;j++) a[i][j]=c[i][j]; } void pow(LL a[N][N],int n)//a=a^n { LL c[N][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(i==j)c[i][j]=1; else c[i][j]=0; while(n) { if(n%2)mult(c,a); mult(a,a); n/=2; } for(int i=0;i<N;i++) for(int j=0;j<N;j++) a[i][j]=c[i][j]; } int main() { int n; while(1) { scanf("%d",&n); if(n==-1)break; //if(n==0){printf("0\n");continue;}因为n=0时输出为1,所以+的特判。。结果反而错了。下面是状态转移的矩阵 LL dp[N][N]={ {0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,1,0}, {0,0,0,0,0,1,0,0}, {0,0,0,0,1,0,0,1}, {0,0,0,1,0,0,0,0}, {0,0,1,0,0,0,0,0}, {0,1,0,0,0,0,0,1}, {1,0,0,1,0,0,1,0}}; pow(dp,n+2); printf("%I64d\n",dp[0][0]); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator