UVA10689-Otra secuencia numérica más (potencia de matriz rápida)

Definamos otra secuencia numérica, dada por la siguiente función:
f (0) = a
f (1) = b
f (n) = f (n - 1) + f (n - 2), n> 1
Cuando a = 0 yb = 1, esta secuencia da la secuencia de Fibonacci. Al cambiar los valores de
ayb, puede obtener muchas secuencias diferentes. Dados los valores de a, b, tienes que encontrar los últimos m dígitos de
f (n).
Entrada
La primera línea proporciona el número de casos de prueba, que es menor que 10001. Cada caso de prueba consta de una
sola línea que contiene los números enteros abn m. Los valores de ayb varían en [0, 100], el valor de n rangos en
[0, 1000000000] y el valor de m rangos en [1, 4].
Salida
Para cada caso de prueba, imprima los últimos m dígitos de f (n). Sin embargo, NO debe imprimir ningún cero a la izquierda.
Ejemplo de entrada
4
0 1 11 3
0 1 42 4
0 1 22 4
0 1 21 4
Salida de muestra
89
4296
7711
946

Pregunta: Dados los dos primeros dígitos de un Fibonacci, encuentre los últimos m dígitos de F (n)

Idea:
Inserte la descripción de la imagen aquí
Código de CA de alimentación rápida de matriz :

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define ll long long
ll mod;
const int N=2;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
    
    
    memset(tmp,0,sizeof tmp);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
        {
    
    
            tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j])%mod;
        }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        a[i][j]=tmp[i][j]%mod;
}
int res[N][N];
void Pow(int a[][N],int n)
{
    
    
    memset(res,0,sizeof res);
    for(int i=0;i<N;i++) res[i][i]=1;
    while(n)
    {
    
    
        if(n&1)
            multi(res,a,N);
        multi(a,a,N);
        n>>=1;
    }
}
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        int a,b,m;
        ll n;
         scanf("%d%d%lld%d",&a,&b,&n,&m);
        mod=1;
       while(m--)
       {
    
    
           mod*=10;
       }
         if(n==0)
        {
    
    
            printf("%d\n",a%mod);continue;
        }
        if(n==1)
        {
    
    
            printf("%d\n",b%mod);continue;
        }
        int x[N][N];
        int y[N][N];
        x[0][0]=1;
        x[1][0]=1;
        x[0][1]=1;
        x[1][1]=0;
        y[0][0]=b;
        y[1][0]=a;
        Pow(x,n-1);
        multi(res,y,2);
        printf("%d\n",res[0][0]);
    }
}

Esta maldita función de pow, hay un error en la raíz cuadrada, es comprensible, por qué todavía hay un error en la potencia, me atascó durante dos horas. . . .
Nota: cuando pow es mayor que 10,000, ocurrirá un error de 1

Supongo que te gusta

Origin blog.csdn.net/weixin_43244265/article/details/104361308
Recomendado
Clasificación