矩阵基础1008 UVA 11885

来源:互联网 发布:js与java aes 编辑:程序博客网 时间:2024/05/16 05:19

题意:
给出p,求出最小包围的矩形的周长为p的形状的个数,不包括矩形
思路:
发现如果包括矩形的话,这个个数就是一个斐波那契序列
然后就先求出来包括矩形的,然后再减去就行了

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define lowbit(x) (x&(-x))typedef long long LL;const int maxn = 100005;const int inf=(1<<28)-1;#define Matrix_Size 5const LL MOD = 987654321;int Size;struct Matrix{    LL mat[Matrix_Size][Matrix_Size];    void clear()    {        memset(mat,0,sizeof(mat));    }    void output()    {        for(int i = 0;i < Size;i++)        {            for(int j = 0;j < Size;j++)                printf("%lld ",mat[i][j]);            printf("\n");        }    }    Matrix operator *(const Matrix &b)const    {        Matrix ret;        for(int i = 0;i < Size;i++)            for(int j = 0;j < Size;j++)            {                ret.mat[i][j] = 0;                for(int k = 0;k < Size;k++)                {                    long long tmp = (long long)mat[i][k]*b.mat[k][j]%MOD;                    ret.mat[i][j] = (ret.mat[i][j]+tmp);                    if(ret.mat[i][j]>=MOD)                        ret.mat[i][j] -= MOD;                    if(ret.mat[i][j]<0)//注意是否需要MOD                         ret.mat[i][j] += MOD;                }            }        return ret;    }};Matrix pow_M(Matrix a,long long n){    Matrix ret;    ret.clear();    for(int i = 0;i < Size;i++)        ret.mat[i][i] = 1;    Matrix tmp = a;    while(n)    {        if(n&1)ret = ret*tmp;        tmp = tmp*tmp;        n>>=1;    }    return ret;}int main(){    LL n;    while(~scanf("%lld",&n)&&n)    {        if(n&1||n<=6)        {            printf("0\n");            continue;        }        Size=2;        Matrix A,B;        A.clear(),B.clear();        A.mat[0][0]=A.mat[0][1]=1;        A.mat[1][0]=1;        B.mat[0][0]=1;B.mat[1][0]=1;        A=pow_M(A,n-5);        //A.output();        A=A*B;        int Ans=A.mat[0][0];        //A.output();        n/=2;        if(n%2==0) Ans=(Ans+1)%MOD;        Ans=(Ans-n/2*2+MOD)%MOD;        printf("%d\n",Ans);    }    return 0;}
0 0