矩阵快速幂--HDU 6030 Happy Necklace
Problem Description
Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of multiple red and blue beads.
Little Q desperately wants to impress his girlfriend, he knows that she will like the necklace only if for every prime length continuous subsequence in the necklace, the number of red beads is not less than the number of blue beads.
Now Little Q wants to buy a necklace with exactly n beads. He wants to know the number of different necklaces that can make his girlfriend happy. Please write a program to help Little Q. Since the answer may be very large, please print the answer modulo 109+7.
Note: The necklace is a single string, {not a circle}.
Input
The first line of the input contains an integer T(1≤T≤10000), denoting the number of test cases.
For each test case, there is a single line containing an integer n(2≤n≤1018), denoting the number of beads on the necklace.
Output
For each test case, print a single line containing a single integer, denoting the answer modulo 109+7.
Sample Input
2
2
3
Sample Output
3
4
题意: 给出红蓝两种,然后排成一个字符串,要求在每一个长度为素数的区间里面是的r(red)的数量不小与b(blue)的数量;
思路:想象当n为2的时候的情况是 rr,rb,br,三种情况,当n为3的时候相当于在后面添加一个b或者r,会发现形成rr的情况是前面rr和br的和,形成br的情况是前面的rb,而形成rb的情况是前面的rr,不能有前面的br形成rb,因为在素数为3的时候不能形成brb;
所以你会发现这个针对的素数只是2和3;
根据递推,设数组a[],b[],c[]分别为后面两个字母为rr,br,rb的字符串的数量,那么可以得到递推式:
a[i] = a[i - 1] + c[i - 1];b[i] = a[i - 1];c[i] = b[i - 1];
而题中要求的是所有的字符串,即s[n] = a[n] + b[n] + c[n];
可以得出s[i] = s[i - 1] + s[i - 3];
n的范围是10^18,那么只能用到矩阵快速幂: 可以推出最初的矩阵为
1 0 1
1 0 0
0 1 0
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
struct martix{
    ll mo[4][4];
    martix(){
        memset(mo,0,sizeof(mo));
    }
};
martix mul(martix a,martix b){
    martix c;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            for(int k=0;k<4;k++){
                c.mo[i][j]=(c.mo[i][j]+a.mo[i][k]*b.mo[k][j])%mod;
            }
        }
    }
    return c;
}
ll powmod(martix a,ll n){
    martix T;
    for(int i=0;i<4;i++){
        T.mo[i][i]=1;
    }
    while(n){
        if(n&1) T=mul(a,T);
        n>>=1;
        a=mul(a,a);
    }
    return (T.mo[0][0]*6+T.mo[0][1]*4+T.mo[0][2]*3)%mod;
}
int main()
{
    ll t;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        int ans[5]={0,0,3,4,6};
        if(n<=4){
            cout<<ans[n]%mod<<endl;
        }
        else{
            martix q;
            q.mo[0][0]=q.mo[0][2]=q.mo[3][2]=q.mo[1][0]=q.mo[2][1]=q.mo[3][2]=1;
            cout<<powmod(q,n-4)%mod<<endl;
        }
    }
    return 0;
}
矩阵快速幂--HDU 6030 Happy Necklace的更多相关文章
- HDU 6395  分段矩阵快速幂     HDU 6386   建虚点+dij
		http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) Me ... 
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
		题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ... 
- 循环节 + 矩阵快速幂 - HDU 4291 A Short problem
		A Short problem Problem's Link Mean: 给定一个n,求:g(g(g(n))) % 1000000007 其中:g(n) = 3g(n - 1) + g(n - 2), ... 
- (hdu 6030) Happy Necklace     找规律+矩阵快速幂
		题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a nec ... 
- HDU 2855 斐波那契+矩阵快速幂
		http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ... 
- HDU 2855 (矩阵快速幂)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目大意:求$S(n)=\sum_{k=0}^{n}C_{n}^{k}Fibonacci(k)$ ... 
- HDU 2842 (递推+矩阵快速幂)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ... 
- HDU 4471 矩阵快速幂 Homework
		题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ... 
- HDU 5950:Recursive sequence(矩阵快速幂)
		http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ... 
随机推荐
- Fastdfs文件系统扩容
			1.简介 FastDFS文件服务器在设计时,为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式.存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是 ... 
- MTK Android Camera新增差值
			一. 计算需要的插值 如果原有的插值列表没有我们需要的插值的时候,要通过计算算出符合需求的插值,比如2700W的插值. 具体计算方法如下: 假设像素的长宽分别为X,Y,则插值为XY.由于MTK规定各参 ... 
- C语言数据结构栈
			#include<stdio.h>#include<stdlib.h>typedef struct Node{ int data; struct Node* pnext;}no ... 
- Python常见数据结构-推导式
			推导式是一种重要的Python特性,是一种简单精炼创建Python数据结构的方式. 列表推导式,详细参考https://www.jianshu.com/p/0a269715a742 基本格式为:[表达 ... 
- Array(数组)对象-->push() 方法
			1.定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法: array.push(item1, item2, ..., itemX) 参数:item1, item2, ... 
- openwrite使用说明
			访问官网https://openwrite.cn/注册登录 访问https://openwrite.cn/plugin-chrome/ 下载插件和安装插件"OpenWrite助手1.1.4& ... 
- 面试题 ~ 什么是RESTful?
			一 : 说说什么是REST规则 ① 首先什么是REST ? 基于HTTP.URI.XML.JSON等标准和协议,支持轻量级.跨平台.跨语言的架构设计.是Web服务的一种新的架构风格(一种思想). ... 
- 编写高质量Python程序(三)基础语法
			本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 关于导入模块 Python的3种引入外部模块的方式:import语句.from ... import ... ... 
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings
			Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation fo ... 
- 天天在用Redis,持久化方案你又知道哪些?
			前言 文章首发于微信公众号[码猿技术专栏]:天天用Redis,持久化方案有哪些你知道吗? Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原 ... 
