HDU1005矩阵相乘二分法

来源:互联网 发布:xbox360手柄连接mac 编辑:程序博客网 时间:2024/06/11 19:13

给出A,B,n 求f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

(1 <= A, B <= 1000, 1 <= n <= 100,000,000).

用以为数组存储f(n)的话  n的数值过大  无法存储

用矩阵相乘解决

 

 
求矩阵的n次方 可以用二分法
当n是偶数的时候
a^n=a^(n/2)*a^(n/2);
当 n为奇数的时候
a^n=a^(n/2)*a^(n/2)*a;
代码如下
#include<cstring>
#include<cstdio>
using namespace std;
typedef struct Matrix
{
    int s[2][2];
} M;
M Multiply(M a,M b)
{
    M c;
    memset(c.s,0,sizeof(c.s));
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            for(int k=0; k<2; k++)
            {
                c.s[i][j]+=(a.s[i][k]*b.s[k][j])%7;
            }
        }
    }
    return c;
}
M pow(M a,int n)
{
    M b;
    if(n==0)
    {
        memset(b.s,0,sizeof(b.s));
        for(int i=0; i<2; i++)
        {
            b.s[i][i] = 1;
        }
        return b;
    }
    else
    {
        M k=pow(a,n/2);
        if(n%2==1)
        {
            return Multiply(Multiply(k,k),a);
        }
        else return Multiply(k,k);
    }
}
int main()
{
    int A,B,n;
    M a;
    while(scanf("%d%d%d",&A,&B,&n)!=EOF)
    {
        if(A==0&&B==0&&n==0) break;
        else
        {
            a.s[0][0]=A;
            a.s[0][1]=B;
            a.s[1][0]=1;
            a.s[1][1]=0;
            M b=pow(a,n-2);
            printf("%d\n",(b.s[0][0]+b.s[0][1])%7);
        }
    }
    return 0;
}

 

原创粉丝点击