AC日记——3的幂的和 51nod 1013

3的幂的和

思路;

  矩阵快速幂;

    sn-1      3 1        sn

      *          =

  1      0 1     1

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define mod 1000000007

struct NodeType {
    long long a[3][3];
};
struct NodeType ans;

long long n;

struct NodeType mul(NodeType pos)
{
    NodeType res;
    res.a[1][1]=0,res.a[1][2]=0;
    res.a[2][1]=0,res.a[2][2]=0;
    for(int i=1;i<=2;i++)
    {
        for(int j=1;j<=2;j++)
        {
            for(int v=1;v<=2;v++)
            {
                res.a[i][j]=(res.a[i][j]+(pos.a[i][v]*pos.a[v][j])%mod)%mod;
            }
        }
    }
    return res;
}

void poww(int mi)
{
    NodeType pos;
    pos.a[1][1]=3,pos.a[1][2]=1;
    pos.a[2][1]=0,pos.a[2][2]=1;
    while(mi>0)
    {
        struct NodeType res;
        res.a[1][1]=0,res.a[1][2]=0;
        res.a[2][1]=0,res.a[2][2]=0;
        if(mi&1)
        {
            for(int i=1;i<=2;i++)
            {
                for(int j=1;j<=2;j++)
                {
                    for(int v=1;v<=2;v++)
                    {
                        res.a[i][j]=(res.a[i][j]+(ans.a[i][v]*pos.a[v][j])%mod)%mod;
                    }
                }
            }
            ans=res;
        }
        pos=mul(pos),mi=mi>>1;
    }
}

int main()
{
    scanf("%lld",&n);n--;
    ans.a[1][1]=3,ans.a[1][2]=1;
    ans.a[2][1]=0,ans.a[2][2]=1;
    poww(n);
    cout<<(ans.a[1][1]+ans.a[1][2])%mod;
    return 0;
}
时间: 2024-12-25 08:34:32

AC日记——3的幂的和 51nod 1013的相关文章

51Nod - 1013 3的幂的和

51Nod - 1013 3的幂的和 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 Input 输入一个数N(0 <= N <= 10^9) Output 输出:计算结果 Input示例 3 Output示例 40 题解: 这道题的解体方法很多. 有公式法,直接利用等比数列求和公式(用long long类型保存才行.) 有快速迭代幂算法.本题解就是采用较笨的方法. #include <iostream> #include <vector>

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

poj 2778 AC自动机 + 矩阵快速幂

// poj 2778 AC自动机 + 矩阵快速幂 // // 题目链接: // // http://poj.org/problem?id=2778 // // 解题思路: // // 建立AC自动机,确定状态之间的关系,构造出,走一步 // 能到达的状态矩阵,然后进行n次乘法,就可以得到状态间 // 走n步的方法数. // 精髓: // 1):这个ac自动机有一些特别,根节点是为空串,然而 // 每走一步的时候,如果没法走了,这时候,不一定是回到根 // 节点,因为有可能单个的字符时病毒,这样

POJ POJ 2778 DNA Sequence AC自动机 + 矩阵快速幂

首先建立Trie和失败指针,然后你会发现对于每个节点 i 匹配AGCT时只有以下几种情况: i 节点有关于当前字符的儿子节点 j 且安全,则i 到 j找到一条长度为 1的路. i 节点有关于当前字符的儿子节点 j 且 不安全,则i 到 j没有路. i 节点没有关于当前字符的儿子节点 但是能通过失败指针找到一个安全的节点j,那么 i 到 j 找到一条长度为1的路. 关于节点安全的定义: 当前节点不是末节点且当前节点由失败指针指回跟节点的路径上不存在不安全节点,那么这个节点就是安全节点. 然后问题就

hdu 2243 AC自动机 + 矩阵快速幂

// hdu 2243 AC自动机 + 矩阵快速幂 // // 题目大意: // // 给你一些短串,问在长度不超过k的任意串,包含至少一个这些短串的其中 // 一个.问这样的串有多少个. // // 解题思路: // // 首先, 包含和不包含是一种互斥关系,包含+不包含 = 全集u.全集的答案就是 // 26 ^ 1 + 26 ^ 2 + .... + 26 ^ k.不包含的比较好求.构建一个自动机,得到 // 一个转移矩阵A.表示状态i能到状态j的方法数.而这些状态中都是不包含所给的 //

HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)

题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <algorithm> #include <vector> #include &l

HDU 2243 考研路茫茫――单词情结 (AC自动机 + 矩阵快速幂)

题目链接:考研路茫茫――单词情结 做本题前,个人建议先做一下POJ 2778 http://blog.csdn.net/u013446688/article/details/47378255 POJ2778 是求长度为n,不包含模式串的字符串个数. 而本题是求长度为n,包含模式串的字符串个数.直接用字符串总数减去不包含模式串的字符串个数即为所求. 同样是AC自动机 + 矩阵快速幂.但是还是有所不同的. 因为对2^64取模,所以定义数据类型为unsigned long long就可以了,这样就实现

AC日记——最小正子段和 51nod 1065

最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 50005 #define ll long long #define INF 0x7fffffff str

AC日记——石子归并 51nod 1021

石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algori