HDU - 6030 矩阵快速幂 +多组输入快速幂板子
题意:一个项链用n个珠子构成,是一个条而不是一个环,由红和蓝两种颜色构成,要求以任意点为起点向后的素数个珠子中,保证红颜色的大于等于蓝颜色的,问你有多少种方案满足,范围:n(2≤n≤1018)
推导过程参考链接:https://blog.csdn.net/nobleman__/article/details/78345142
我们知道最小的素数就是2了,由于考虑到是从任意一点开始,如果到了某一点往后没有两个的话就直接符合了,所以在n = 1的情况下,答案为2,也就是一个红,或一个蓝,首先我们可以在(n-1)项的基础上在末尾再添加一个红色,显然符合题意,其次我们考虑下因为最小的素数为2,所以不允许出现【蓝红蓝】的情况,但是可以出现【蓝红红蓝】的情况,所以当(n-1)项中后面连续两个是红色的时候我们就可以在末尾添加一个蓝色,我们可以发现(n-1)项中末尾是【红红】的数目恰好等于(n-3)的数目
————————————————
推导方程为:Fn=F(n-1)+F(n-3)
|Fn F(n-1) F(n-2)| = |F(n-1) F(n-2) F(n-3)| * |1 1 0|
|0 0 1|
|1 0 0|
代码:
1 #include<bits/stdc++.h>
2 #define ll long long
3 #define mod(x) ((x)%MOD)
4
5 using namespace std;
6
7 const ll MOD = 1e9 + 7;
8
9 struct mat
10 {
11 ll m[3][3];
12 } a,ans,unit;
13 ll n;
14
15 void init()
16 {
17 memset(a.m,0,sizeof(a.m));
18 a.m[0][0] = 1;
19 a.m[0][1] = 1;
20 a.m[1][2] = 1;
21 a.m[2][0] = 1;
22 }
23
24 mat operator * (mat m1,mat m2)
25 {
26 mat t;
27 ll r;
28 for(int i = 0; i < 3; i++)
29 {
30 for(int j = 0; j < 3; j++)
31 {
32 r = 0;
33 for(int k = 0; k < 3; k++)
34 {
35 r = mod(r*1ll + mod(m1.m[i][k]*1ll*m2.m[k][j]));
36 }
37 t.m[i][j] = r;
38 }
39 }
40 return t;
41 }
42
43 mat quick_pow(ll x)
44 {
45 mat t;
46 for(int i=0;i<3;++i)
47 for(int j=0;j<3;++j)
48 t.m[i][j]=0;
49 for(int i=0;i<3;++i)
50 t.m[i][i]=1;
51 while(x)
52 {
53 if(x & 1) t = t*a;
54 a = a*a;
55 x >>= 1;
56 }
57 return t;
58 }
59
60 int main()
61 {
62 memset(unit.m,0,sizeof(unit.m));
63 unit.m[0][0] = 4;
64 unit.m[0][1] = 3;
65 unit.m[0][2] = 2;
66 ios_base::sync_with_stdio(0);
67 int T;
68 cin>>T;
69 init();
70 while(T--)
71 {
72 init();
73 cin>>n;
74 if(n < 4)
75 {
76 if(n == 1) cout<<2<<endl;
77 if(n == 2) cout<<3<<endl;
78 if(n == 3) cout<<4<<endl;
79 continue;
80 }
81 ans = quick_pow(n-3);
82 cout<<((unit.m[0][0]*ans.m[0][0])%MOD+(unit.m[0][1]*ans.m[1][0])%MOD+(unit.m[0][2]*ans.m[2][0])%MOD)%MOD<<endl;
83 }
84 return 0;
85 }
HDU - 6030 矩阵快速幂 +多组输入快速幂板子的更多相关文章
- hdu 6030 矩阵快速幂
大致题意: 一条长度为n的项链,由红色珠子和蓝色珠子(分别用1和0表示)组成,在连续的素数子段中,红色珠子的个数不能少于蓝色珠子.问组成这个项链有多少种方案,求方案数模1000000007 分析: 首 ...
- hdu 4291 矩阵幂 循环节
http://acm.hdu.edu.cn/showproblem.php?pid=4291 凡是取模的都有循环节-----常数有,矩阵也有,并且矩阵的更奇妙: g(g(g(n))) mod 109 ...
- HDU 5768 Lucky7 (中国剩余定理 + 容斥 + 快速乘法)
Lucky7 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 Description When ?? was born, seven crow ...
- NYOJ-676小明的求助,快速幂求模,快速幂核心代码;
小明的求助 时间限制:2000 ms | 内存限制:65535 KB 难度:2 描述 小明对数学很有兴趣,今天老师出了道作业题,让他求整数N的后M位,他瞬间感觉老师在作弄他,因为这是so easy ...
- 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
原文 http://technet.microsoft.com/zh-cn/subscriptions/hh465387 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows ...
- PY3 多组输入
在c语言你能使用while(scanf(“%d”,x) !=EOF)判断输入是否碰到文件结束符(EOF). 但是在python你不能使用while((x=input())!=EOF). 这有两种方法可 ...
- POJ 1182 食物链(经典并查集) (多组输入有时乱加也会错!)
多组输入有时乱加也会错! 这次用多组输入竟然,不用竟然对了,所以以后做题目,若是答案错误,先看加上或者删掉多组输入,看对不对 食物链 Time Limit: 1000MS Memory Lim ...
- Python 多组输入
#基于Python2.7 #若是想Python做到和C++中while(scanf()!=EOF)一样的多组输入效果,可以如实例所示书写 #实例实现了多组输入,计算A+B+C并输出的任务 while ...
- (hdu 6030) Happy Necklace 找规律+矩阵快速幂
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a nec ...
随机推荐
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
- SDUST数据结构 - chap9 排序
判断题: 选择题: 编程题: 7-1 排序: 输入样例: 11 4 981 10 -17 0 -20 29 50 8 43 -5 输出样例: -20 -17 -5 0 4 8 10 29 43 50 ...
- 理解Go的多态实现
总结两点: 在Go中,定义一个interface类型,该类型说明了它有哪些方法.使用时,在函数中,将该interface类型作为函数的形参,任意一个实现了interface类型的实参都能作为该inte ...
- uni-app开发经验分享七: 有关列表数据下拉加载方法的解析及记录
在使用uni.request获取后台数据时,我们往往碰到一个问题,列表的懒加载及数据实时更新,这里记录下我制作这类功能的方法. 问题描述:后台返回数据,前端需要进行10个为一组来分页,先显示前10个, ...
- 炸裂!MySQL 82 张图带你飞
之前两篇文章带你了解了 MySQL 的基础语法和 MySQL 的进阶内容,那么这篇文章我们来了解一下 MySQL 中的高级内容. 其他文章: 138 张图带你 MySQL 入门 47 张图带你 MyS ...
- 全栈性能测试修炼宝典-JMeter实战笔记(一)
了解性能测试 性能测试不仅能够定位.分析问题,还要把握系统性能变化趋势:性能测试工程师能够帮助解决性能问题,搞定测试过程中的各种不合理配置,给出专业的优化建议. 第一章 性能方向职业发展 软件测试职业 ...
- GIT常用命令:
1.安装好Git之后,点击鼠标右键即可看到有Git bush选项,点击即可进入Git命令行操作. 2.使用命令: git config --global user.name "lyh&q ...
- 前序遍历 排序 二叉搜索树 递归函数的数学定义 return 递归函数不能定义为内联函数 f(x0)由f(f(x0))决定
遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...
- Promise 中reject 和 catch 处理上有什么区别
reject 是用来抛出异常,catch 是用来处理异常reject 是 Promise 的方法,而 catch 是 Promise 实例的方法reject后的东西,一定会进入then中的第二个回调, ...
- Mark基本语法
Markdown语法 1. 标题 样式的标题在行的开头使用1-6个#,对应于标题级别1-6.例如: 2.引用 在引用中再嵌套一个引用(在用">"的段落中使用"> ...