poj 3070 求第n个斐波那契数 矩阵 二分
http://poj.org/problem?id=3070
#include<iostream> #include<cstdio> using namespace std; int a[4]; void j(int n) { int q,b,c,d; if(n==1) { a[0]=1;a[1]=1;a[2]=1;a[3]=0; } else { j(n/2); q=a[0]*a[0]+a[1]*a[2]; b=a[0]*a[1]+a[1]*a[3]; c=a[2]*a[0]+a[3]*a[2]; d=a[2]*a[1]+a[3]*a[3]; a[0]=q%10000; a[1]=b%10000; a[2]=c%10000; a[3]=d%10000; if(n%2==1) { q=a[0]+a[1]; b=a[0]; c=a[2]+a[3]; d=a[2]; a[0]=q%10000; a[1]=b%10000; a[2]=c%10000; a[3]=d%10000; } } } int main() { int n; while(scanf("%d",&n),n!=-1) { if(n==0) printf("0\n"); else { j(n); printf("%d\n",a[1]); } } return 0; }
一开始我 两个矩阵相乘再弄了一个函数 返回一个数组的指针 貌似是 指针那里 出错了 具体怎么 错的 我也没搞清。。
贴一下代码 求大神指点
#include<iostream> using namespace std; int *solve(int *a,int *b) { int c[4]; c[0]=a[0]*b[0]+a[1]*b[2]; c[1]=a[0]*b[1]+a[1]*b[3]; c[2]=a[2]*b[0]+a[3]*b[2]; c[3]=a[2]*b[1]+a[3]*b[3]; return c; } int *j(int n,int *a) { if(n==1) return a; int *temp; temp=solve(j(n/2,a),j(n/2,a)); if(n%2==0) return temp; int p[4]={1,1,1,0}; return solve(temp,p); } int main() { int n; while(scanf("%d",&n),n!=-1) { int a[4]={1,1,1,0}; int *w; w=j(n,a); printf("%d\n",w[1]); } return 0; }