矩阵 构造 模板

F - Number Sequence

#include<iostream>
#include<cstdio>
using namespace std;
struct mat
{
    int ans[2][2];
};
mat I,MID;
int M;
mat cal(mat a,mat b)
{
    mat c;
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        {
            c.ans[i][j]=0;
            for(k=0;k<2;k++)
                c.ans[i][j]+=a.ans[i][k]*b.ans[k][j];
                c.ans[i][j]%=7;
        }
    return c;
}
mat atl(int n)
{
    mat res=MID;
    mat mid=I;
    while(n){
    if(n&1)
        res=cal(res,mid);
        mid=cal(mid,mid);
        n>>=1;}
        return res;
}
int main()
{
    int k,i,j;
    int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n)!=-1)
    {
        if(a==0&&b==0&&n==0)
            break;
            I.ans[0][0]=a;
            I.ans[1][0]=b;
            I.ans[0][1]=1;
            I.ans[1][1]=0;
            MID.ans[0][0]=1;
            MID.ans[0][1]=1;
            MID.ans[1][0]=0;
            MID.ans[1][1]=0;
            if(n<3)
            printf("1\n");
            else{
                mat l=atl(n-2);
        printf("%d\n",l.ans[0][0]);
            }
    }
    return 0;
}

时间: 2024-11-01 10:03:57

矩阵 构造 模板的相关文章

hdu 3326 Another kind of Fibonacci (矩阵构造)

题目大意: 描述了另外一种斐波那契 F[n] = x*F[n-1] + y*F[n-2]; 求segma(F[i]^2): 思路分析: 构造矩阵的详细 请戳我 构造矩阵可以得到 中间矩阵为 1 1 0 0 0 x^2      y^2   2*x*y 0 1 0 0 0 x 0 y #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <

简单数论之矩阵构造

其实矩阵构造就是对公式的化简,最后运用矩阵快速幂求值 下面来看一题 Everybody knows Fibonacci numbers, now we are talking about the Tribonacci numbers: T[0] = T[1] = T[2] = 1; T[n] = T[n - 1] + T[n - 2] + T[n - 3] (n >= 3)Given a and b, you are asked to calculate the sum from the ath

矩阵构造

[转]http://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html 讲得不是一般的好: Fibonacci数列:F(0)=Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2) 我们以前快速求Fibonacci数列第n项的方法是 构造常系数矩阵 (一)   Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项快速求法(不考虑高精度) 解法: 考虑1

HDU - 5015 233 Matrix (矩阵构造)

Problem Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be

poj 3735 Training little cats(矩阵构造,快速幂)

Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10350   Accepted: 2471 Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make t

HDU 2243 ( Trie图 矩阵构造幂和 )

题意 :  长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义. 比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词,分别为(2个) aa,ab, (26个)aaa,aab,aac...aaz, (26个)aba,abb,abc...abz, (25个)baa,caa,daa...zaa, (25个)bab,cab,dab...zab. 分析: 我们可以用Tire图跑矩阵快速幂的方法,去求长度为n不包含给定单词的词

幻方的构造模板

/* 幻方的计算: 计算任意阶数幻方的各行.各列.各条对角线上所有数的和的公式为:sum=n*(n^2+1)/2 n为阶数 幻方分为奇阶幻方和偶阶幻方 一.当n为奇数时称为奇阶幻方 1.Merzirac法生成奇阶幻方 在第一行居中的方格内放1,依次向右上方填入2.3.4…,如果右上方已有数字,则向下移一格继续填写. 2.loubere法生成奇阶幻方 在居中的方格向上一格内放1,依次向右上方填入2.3.4…,如果右上方已有数字,则向上移两格继续填写 3.horse法生成奇阶幻方 (1)对于所有的奇

HDU2256-Problem of Precision(矩阵构造+快速幂)

题目链接 题意:求sqrt(sqrt(2) + sqrt(3)) ^ 2n MOD 1024 思路: 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MOD = 1024; int n; struct mat { int s[2][2];

HDU2256-Problem of Precision(矩阵构造+高速幂)

pid=2256">题目链接 题意:求sqrt(sqrt(2) + sqrt(3)) ^ 2n MOD 1024 思路: 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MOD = 1024; int n; struct