Happy Necklace

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1146    Accepted Submission(s): 491

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 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 .
Note: The necklace is a single string, {not a circle}.
 
Input
The first line of the input contains an integer , denoting the number of test cases.
For each test case, there is a single line containing an integer , 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 .
 
Sample Input

223
 
Sample Output

34
 
Source
题目描述:你有一个有n个颜色为红色或蓝色的珠子的项链,你可以将项链截断成长度为素数的珠子,如果截取出的一段红色的珠子的个数大于蓝色的珠子,则成为good,问一共有多少种good的可能性。
    可以发现
    n=2,res=3;n=3,res=4;n=4,res=6;n=5,res=9;
    故有递推式 An=An-1+An-3;

如果用a表示红色,用b表示蓝色。题意明显可以看出只需要管长度2和3的连续序列是否符合!

如果以b结尾,那么下一个必须是a,或者加个aab就可以了!

    所以同理就可以推出递推式An=An-1+An-3;
    看一下题目的数据范围,n最大1e18,因此常规O(n)的递推显然不可行,因此直接上O(logn)的矩阵快速幂。
    发现递推式是四阶的递推式,故所得的常数矩阵应该是四维的。之后只需带入矩阵快速幂模板即可。

先看这个特征方程F[i] = F[i - 1] + F[i - 3],那么就有一个矩阵如下

我们的目标矩阵就是

那么,针对这个矩阵我们如何转置呢?

先看目标矩阵第一个:F[i]

F[i] = F[i - 1] + F[i - 3]

那么,由矩阵乘法,转置矩阵第一行,似乎就定了:1 0 1

同样的,二三行就是1 0 0 和 0 1 0

整个矩阵如下:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring> #define INF 0x3f3f3f3f #define mod 1000000007 using namespace std; typedef long long ll;
const int maxn = ; ll n; struct Matrix {
ll a[][];
}; Matrix mul(Matrix x, Matrix y)
{
Matrix temp;
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++) temp.a[i][j] = ; for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
ll sum = ;
for (int k = ; k <= ; k++)
{
sum = (sum + x.a[i][k] * y.a[k][j] % mod) % mod;
}
temp.a[i][j] = sum;
}
}
return temp;
} Matrix quickpow(Matrix A,ll k)
{
Matrix res;
res.a[][] = ; res.a[][] = ; res.a[][] = ;
res.a[][] = ; res.a[][] = ; res.a[][] = ;
res.a[][] = ; res.a[][] = ; res.a[][] = ;
while (k)
{
if (k & ) res = mul(res, A);
A = mul(A, A);
k >>= ;
}
return res;
} int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%lld", &n);
if (n == )
{
printf("3\n");
continue;
}
Matrix A;
A.a[][] = ; A.a[][] = ; A.a[][] = ;
A.a[][] = ; A.a[][] = ; A.a[][] = ;
A.a[][] = ; A.a[][] = ; A.a[][] = ;
Matrix res = quickpow(A, n - );
ll x = (res.a[][] + res.a[][] + res.a[][]) % mod;
ll y = (res.a[][] + res.a[][] + res.a[][]) % mod;
ll z = (res.a[][] + res.a[][] + res.a[][]) % mod;
printf("%lld\n", (x + y + z) % mod);
}
}

2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)的更多相关文章

  1. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/73982 ...

  2. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

    Deleting Edges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  3. 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)

    Graph Theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  4. 2017中国大学生程序设计竞赛 - 女生专场(dp)

    Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...

  5. 2017中国大学生程序设计竞赛 - 女生专场 1002 dp

    Building Shops Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】

    C HDU - 6025 [题意]:去除数列中的一个数字,使去除后的数列中所有数字的gcd尽可能大. [分析]: 数组prefixgcd[],对于prefixgcd[i]=g,g为a[0]-a[i]的 ...

  7. 2017中国大学生程序设计竞赛 - 女生专场B【DP】

    B HDU - 6024 [题意]:n个教室,选一些教室建造糖果商店. 每个教室,有一个坐标xi和在这个教室建造糖果商店的花费ci. 对于每一个教室,如果这个教室建造糖果商店,花费就是ci,否则就是与 ...

  8. 2017中国大学生程序设计竞赛 - 女生专场A【模拟】

    A HDU - 6023 [题意]:求AC题数和总时长. [分析]:模拟.设置标记数组记录AC与否,再设置错题数组记录错的次数.罚时罚在该题上,该题没AC则不计入总时间,AC则计入.已经AC的题不用再 ...

  9. HDU 6024(中国大学生程序设计竞赛女生专场1002)

    这是CCPC女生专场的一道dp题.大佬们都说它简单,我并没有感到它有多简单. 先说一下题意:在一条直线上,有n个教室,现在我要在这些教室里从左到右地建设一些作为糖果屋,每个教室都有自己的坐标xi 和建 ...

随机推荐

  1. VMware与Windows主机交换文件

    1. 安装 VMwareTool ,直接拖拽文件 2. 安装 VMwareTool,然后WMare配置 共享文件夹 3. 通过 U盘 4. for Linux:Windows安装 SSH Client ...

  2. JNIjw01

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw01.h" JNIEXPORT void JNICALL ...

  3. angular2.x 多选框事件

    angular2.x - 4.x  的多选框事件 ng2 -- ng4 反正都是用es6 都统称为2.x吧. 下面贴代码 html界面 <div class="row"> ...

  4. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  5. 浅谈 session 会话的原理

    先谈 cookie 网络传输基于的Http协议,是无状态的协议,即每次连接断开后再去连接,服务器是无法判断此次连接的客户端是谁. 如果每次数据传输都需要进行连接和断开,那造成的开销是很巨大的. 为了解 ...

  6. spring3: 访问Resource — ResourceLoader/ResourceLoaderAware接口

    4.3.1  ResourceLoader接口 ResourceLoader接口用于返回Resource对象:其实现可以看作是一个生产Resource的工厂类. public interface Re ...

  7. spring4x,暂时停更

    spring4x,暂时停更 鄙人愚笨,没有spring基础,直接上了spring4x,发现无法理解(另外spring4x实战课本演示不详,本人学识有限),现从spring3开始.

  8. 用shell将时间字符串与时间戳互转

    date的详细用户可以参考下面的 http://www.cnblogs.com/xd502djj/archive/2010/12/29/1919478.html date 的具体用法可以查看另外一篇博 ...

  9. shell编程学习2

    1.shell中调用linux命令(1)直接执行(2)反引号括起来执行.有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的 ...

  10. Node.js/Python爬取网上漫画

    某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...