西南民大oj(矩阵快速幂)

我的名字不可能那么难记

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 16            测试通过 : 9

描述

Nirvava:Hi,Misaki,听说ZC要离开了..

Misaki:好走不送,祝一帆风顺…

Nirvana: 但他留了好多doge给我们…

Misaki:……

Nirvana:而且他们还有名字,名字如下。

据说ZC离去的原因之一就是因为第N个doge老是问他能不能记住它的名字。

Misaki:记别人名字什么的,好烦哒,ZC肯定记不住。

Nirvana:ZC当然记得,毕竟是他的宠物嘛。难倒他的是,doge的第二个问题:我的名字有多长。ZC难住了,因为他数着数着就doge精神污染了。

Misaki:这个问题,,真的好难..不过,,他们应该能解决。

PS:这个题面是不是有点熟♂悉,懒得想题面了,就把以前的题面拿出来了。

输入

多组输入

每组一个N(0<N<=10^9)

输出

第N个doge的名字有多长,由于可能太长,你只需要输出长度%1000000007(1e9+7)的结果即可。

样例输入

1
2
3
4
500

样例输出

1
3
7
17
875025602

提示

name[1]="X"

name[2]="XXY"

name[3]="XXYXXYX"

name[4]="XXYXXYXXXYXXYXXXY"

……

以此类推。

分析:设a[i]为总长度,b[i]为X的个数,c[i]为Y的个数,则有a[i]=3*b[i-1]+c[i-1],b[i]=2*b[i-1]+c[i-1],c[i]=b[i-1].

则可构造矩阵

|0,0,0|

|a[i-1] ,b[i-1],c[i-1]|*|3,2,1|=|a[i],b[i],c[i]|

|1,1,0|

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 1000010
using namespace std;
struct matrix
{
    LL m[3][3];
};
LL n;
matrix mult(matrix a,matrix b)
{
    matrix c;
    memset(c.m,0,sizeof(c.m));
    for(int i=0;i<3;i++)
    for(int k=0;k<3;k++)
    {
        if(a.m[i][k]==0)continue;
        for(int j=0;j<3;j++)
        {
            if(b.m[k][j]==0)continue;
            c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;
            c.m[i][j]%=mod;
        }
    }
    return c;
}
matrix quickmod(matrix a,LL n)
{
    matrix temp;
    memset(temp.m,0,sizeof(temp.m));
    for(int i=0;i<3;i++)temp.m[i][i]=1;
    while(n)
    {
        if(n&1)temp=mult(temp,a);
        a=mult(a,a);
        n>>=1;
    }
    return temp;
}

int main()
{
    while(scanf("%lld",&n)!=EOF)
    {
        if(n==1){puts("1");continue;}
        matrix ans;
        memset(ans.m,0,sizeof(ans.m));
        ans.m[0][0]=0;ans.m[0][1]=0;ans.m[0][2]=0;
        ans.m[1][0]=3;ans.m[1][1]=2;ans.m[1][2]=1;
        ans.m[2][0]=1;ans.m[2][1]=1;ans.m[2][2]=0;
        ans=quickmod(ans,n-1);
        printf("%lld\n",ans.m[1][0]);
    }
}

时间: 2024-09-30 16:02:06

西南民大oj(矩阵快速幂)的相关文章

西南民大oj(两园交求面积)

西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 11            测试通过 : 8 描述 小朋友们 你们好~ 你们都知道AT立场吧 AT立场又叫“A T Field”,是“Absolute Terror Field”的缩写.直译作“绝对恐怖领域”,又称绝

西南民大oj 1762 我的式子不可能那么难写 【波兰式】

描述 啦啦啦.作为一个苦逼的程序猿.?.请看下图... 现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金..快帮他写吧... 给一个包含+-*/()的正确的表达式.要你计算它的结果. 除法的规则类似C/C++中取整除法.比如:9/5=1 10/5=2 其他规则参照现实... 输入 多组测试样例 一行字符串(长度小于200) 所有参与运算的数字都为小于1000正整数. 表达式中存在空格. 数据保证合法. 输出 一行 表达式的结果 样例输入 1+23+(5-6/(1+

西南民大oj(递推)

我的数学不可能那么难推 时间限制(普通/Java) : 3000 MS/ 9000 MS          运行内存限制 : 65536 KByte总提交 : 49            测试通过 : 24 描述 没什么题出了,怎么办呀~ 好吧,百度一道去. 于是此题横空出世,只为开心. 小明喜欢下棋,一日他闲来无聊,将黑白棋子排成一长条观察,发现黑色混在一起好难看啊. 随即想到,黑与黑子不相邻,摆放成一长条,有多少种可能乎?! 输入 多组测试数据,(大概1w组吧) 第一行,棋子的总数 n  (

UVA - 10689 Yet another Number Sequence 矩阵快速幂

                  Yet another Number Sequence Let’s de?ne another number sequence, given by the following function:f(0) = af(1) = bf(n) = f(n − 1) + f(n − 2), n > 1When a = 0 and b = 1, this sequence gives the Fibonacci Sequence. Changing the values

探索(数学)(矩阵快速幂)(快速乘)

一句话题意:三维空间划分四维空间,最多能划分成多少个部分. 我们直接想四维的不好想,但是一般这种题我们考虑从低维开始做起. 在经过手算之后我们可以发现: 设\(f(x)\)为零维(点)切一维(线)最多划分的部分,递推式:\(f(x)=f(x-1)+1\) 设\(g(x)\)为一维(线)切二维(平面)最多划分的部分,递推式:\(g(x)=g(x-1)+f(x-1)\) 设\(k(x)\)为二维(平面)切三维(空间)最多划分的部分,递推式:\(k(x)=k(x-1)+g(x-1)\) 设\(h(x)

Light OJ 1268 Unlucky Strings 矩阵快速幂+KMP

题目来源:Light OJ 1268 Unlucky Strings 题意:给你一些可以用的字符 然后求组成不包含给定字符串的方案数 思路:矩阵经典问题 从i走k步路到达j的方案数 可以用矩阵快速幂求解 对于求长度为n的字符的方案数 就是走n步路 求走法 可以用KMP求出走一步 从前i个字符到前j个字符的方案数 这点有点不好理解 想一想 #include <cstdio> #include <cstring> #include <algorithm> #include

【矩阵快速幂】POJ 3070 Fibonacci (大数 Fibonacci)(大二版)

题目链接:click here~~ 题目大意: In the Fibonacci integer sequence, F0 = 0, F1 = 1, andFn = Fn ? 1 + Fn ? 2 forn ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, - An alternative formula for the Fibonacci s

点头OJ 1033 . 骨牌覆盖 V2 ( 状态压缩 + 矩阵快速幂 )

做题感悟:先前做过一个类似的题,是俄罗斯的一道区域赛的题目,也是用的状态压缩 + 矩阵快速幂. 解题思路:状态压缩 + 矩阵快速幂 构造一个矩阵 B [ i ] [ j ] 代表状态 i ,与状态 j 是否合法,j 代表上一行的状态,如果合法为 1 ,否则为 0 ,这样如果再得到初始各种状态的方案数的矩阵 A ,A 只有一列 ,这样 B * A 就是第二行各种状态对应 的方案数 .这样再加上矩阵快速幂就解决了. 代码: #include<iostream> #include<sstrea

SHUOJ1857 Yaoge鸡排系列之九——好多鸡排!!!【矩阵快速幂】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1857 1857: Yaoge鸡排系列之九——好多鸡排!!! Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 98  Solved: 6 Description Yaoge买了n块鸡排,其中第n块鸡排的质量为M(n),同时