hdu 6030 矩阵快速幂
大致题意:
一条长度为n的项链,由红色珠子和蓝色珠子(分别用1和0表示)组成,在连续的素数子段中,红色珠子的个数不能少于蓝色珠子。问组成这个项链有多少种方案,求方案数模1000000007
分析:
首先我们看看边界情况n=2
01
10
11
有如上3种情况
再观察一下n=3的情况
011
101
111
110
这四个方案中有3种方案(011,101,111)有关联,n=2的情况再加一个1,结尾为1,那么肯定也有为结尾为0的情况。我们继续推测
n=4
0111
1011
1111
1101
0110
1110
前面四个,即n=3时再加一个1,后面两个是在n=1时加上110使结尾为0,但是n=1时0不应该是不满足条件吗。我们仔细看看题目,连续的素数子段,1并不是素数。
综上所述,加1或者加110。a(n)=a(n-1)+a(n-3)
初始状态是a2,不是a1
有了递推式,但是n又很大,所以我们得构造矩阵利用快速幂来求解。我们可以构造如下矩阵
a(n) a(n-1) a(n-2) = a(n-1) a(n-2) a(n-3) * 1 1 0
0 0 1
1 0 0
Mat=1 1 0
0 0 1
1 0 0
a(n) a(n-1) a(n-2) = a(4) a(3) a(2) * Mat^(n-4)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; const int N=3;
typedef long long ll;
const ll Mod=1000000000+7; struct Mat
{
ll mat[N+1][N+1];
};
Mat Multiply(Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(c.mat));
for(int k = 0; k < N; ++k)
for(int i = 0; i < N; ++i)
if(a.mat[i][k])
for(int j = 0; j < N; ++j)
if(b.mat[k][j])
c.mat[i][j] = (c.mat[i][j] +a.mat[i][k] * b.mat[k][j])%Mod;
return c;
} Mat QuickPower(Mat a, ll k)
{
Mat c;
memset(c.mat,0,sizeof(c.mat));
for(int i = 0; i < N; ++i)
c.mat[i][i]=1;
for(; k; k >>= 1)
{
if(k&1) c = Multiply(c,a);
a = Multiply(a,a);
}
return c;
} int main()
{
int T;
scanf("%d",&T);
ll a[]={0,2,3,4,6};
Mat A;
A.mat[0][0]=1,A.mat[0][1]=1,A.mat[0][2]=0;
A.mat[1][0]=0,A.mat[1][1]=0,A.mat[1][2]=1;
A.mat[2][0]=1,A.mat[2][1]=0,A.mat[2][2]=0;
while(T--)
{
ll n;
scanf("%I64d",&n);
if(n<=4)
{
printf("%I64d\n",a[n]);
continue;
}
Mat ans=QuickPower(A,n-4);
printf("%I64d\n",(a[4]*ans.mat[0][0]+a[3]*ans.mat[1][0]+a[2]*ans.mat[2][0])%Mod);
}
return 0;
}
hdu 6030 矩阵快速幂的更多相关文章
- HDU - 6030 矩阵快速幂 +多组输入快速幂板子
题意:一个项链用n个珠子构成,是一个条而不是一个环,由红和蓝两种颜色构成,要求以任意点为起点向后的素数个珠子中,保证红颜色的大于等于蓝颜色的,问你有多少种方案满足,范围:n(2≤n≤1018) 推导过 ...
- HDU 2855 (矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ...
- HDU 4471 矩阵快速幂 Homework
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...
- HDU - 1575——矩阵快速幂问题
HDU - 1575 题目: A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n( ...
- hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...
- 随手练——HDU 5015 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- How many ways?? HDU - 2157 矩阵快速幂
题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...
- HDU 5950 矩阵快速幂
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- 查看 swappiness 值
Swap的使用频率 发表于 2017-06-02 | 分类于 Linux | 评论数: 通过调整swappiness的值, 可以调整系统使用 swap 的频率 该值越小, 表示越大限度的使用物理 ...
- sed常用
行首添加字符串 # cat a [root@localhost b]# vim a 文件a将每行的第1列添加HEAD [root@localhost b]# sed 's/^/HEAD &/g ...
- 064.Python开发虚拟环境
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难.此时,我们需要对于不同的工程使用不同 ...
- logstash数据处理及格式化功能详解
Grok正则提取日志 环境延续我上一篇ELK单机版的filebeat-->redis-->logstash-->elasticsearch-->kibana环境,详情请参考: ...
- Python应用与实践-转自(吴秦(Tyler))
1. Python是什么? 1.1. Python语言 1.2. Python哲学 2. Python在工作中的应用 2.1. 实例1:文件批量处理 ...
- 文件包含之包含了Linux文件描述符
0x00 原理 文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符. 翻译成人话- 可以认为是指向文件的一个指针,如果有文件 ...
- SpringBoot 实现整合log4j2日志
关于日志级别 共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF. ...
- [leetcode] 37. 解数独(Java)(dfs,递归,回溯)
37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...
- Jmeter- 笔记3 - Jmeter录制功能 / 抓包
http代理服务器录制脚本: 1.新建线程组 2.添加 http代理服务器 元件 3.http代理服务器修改: 1)端口:8899,任意给个无占用的 2)目标控制器:改成刚刚新建的线程组.不改就录制会 ...
- 人脸标记检测:ICCV2019论文解析
人脸标记检测:ICCV2019论文解析 Learning Robust Facial Landmark Detection via Hierarchical Structured Ensemble 论 ...