void mul(LL c[][2],LL a[][2],LL b[][2]) // c = a * b
{
static LL t[2][2];
memset(t,0,sizeof t);
for(int i = 0;i < 2;i++)
for(int j = 0;j < 2;j++)
for(int k = 0;k < 2;k++)
t[i][j] = (t[i][j] + qmul(a[i][k] + a[k][j])) % p;
memcpy(c,t,sizeof t);
}
LL F(LL n) //利用快速幂
{
if(!n) return 0;
LL f[2][2] = {
{0,1},
{1,1},
};
for(LL k = n - 1;k;k >>= 1)
{
if(k & 1) mul(f,f,a); //f = f * a
mul(a,a,a); //a = a * a
}
return f[0][0];
}
算出斐波那契数列中的每一项的值(快速幂解法)
最新推荐文章于 2022-11-15 21:48:52 发布