2013金山西山居创意游戏程序挑战赛——初赛(2)M斐波那契数列
这题很容易就可以推出f(n)的公式。
这个用到了矩阵和整数的快速2分幂,还需注意一点就是pow(n,m)=pow(n,m mod 1000000006);
千万注意别写成mod 1000000007 ,否者会一直WA的。
#include<iostream>
#include<stdio.h>
using namespace std;
typedef __int64 in;
struct aa
{
in a[2][2];
void init()
{
a[0][0]=a[0][1]=a[1][0]=1;
a[1][1]=0;
}
};
aa mul(aa m,aa n)
{
aa ans;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
ans.a[i][j]=0;
for(int k=0;k<2;k++)
ans.a[i][j]+=m.a[i][k]*n.a[k][j];
ans.a[i][j]%=1000000006;
}
return ans;
}
aa fun(aa m,long n)
{
aa ans;
ans.init();
while(n)
{
if(n&1)
ans=mul(m,ans);
n>>=1;
m=mul(m,m);
}
return ans;
}
in fun2(in a,long n)
{
in ans=1;
while(n)
{
if(n&1)
ans=(ans*a)%1000000007;
n>>=1;
a=(a*a)%1000000007;
}
return ans%1000000007;
}
int main()
{
long a,b,n;
in i,j,sum;
while(cin>>a>>b>>n)
{
sum=0;
aa ans,p;
ans.init();
if(n==0)
sum=a;
else if(n==1)
sum=b;
else
{
p=fun(ans,n-1);
i=fun2(a,p.a[1][1]%1000000006);
j=fun2(b,p.a[1][0]%1000000006);
sum=i*j;
}
printf("%I64d\n",sum%1000000007);
}
return 0;
}

浙公网安备 33010602011771号