2018年湘潭大学程序设计竞赛 G- 又见斐波那契

推一推矩阵直接快速幂。

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define pii pair<int,int>
 4 #define mk make_pair
 5 #define fi first
 6 #define se second
 7 using namespace std;
 8
 9 const int N=1e5+7;
10 const int M=1e5+7;
11 const int inf=0x3f3f3f3f;
12 const LL INF=0x3f3f3f3f3f3f3f3f;
13 const int mod=1e9+7;
14
15 LL n;
16 struct Matrix {
17     LL a[6][6];
18     Matrix() {memset(a, 0, sizeof(a));}
19     void init() {
20         for(int i = 0; i < 6; i++)
21             for(int j = 0; j < 6; j++)
22                 a[i][j] = (i == j);
23     }
24
25     Matrix operator * (const Matrix &B) const {
26         Matrix C;
27         for(int i = 0; i < 6; i++) {
28             for(int j = 0; j < 6; j++) {
29                 for(int k = 0; k < 6; k++) {
30                     C.a[i][j] = (C.a[i][j] + a[i][k] * B.a[k][j]) % mod;
31                 }
32             }
33         }
34         return C;
35     }
36
37     Matrix operator ^ (const LL &p) const {
38         Matrix A =  *this, res;
39         res.init();
40         LL t = p;
41         while(t) {
42             if(t & 1) res = res * A;
43             A = A * A; t >>= 1;
44         }
45         return res;
46     }
47 }A;
48
49
50 int main() {
51
52     int a[6][6] = {
53         {1, 1, 1, 1, 1, 1},
54         {1, 0, 0, 0, 0, 0},
55         {0, 0, 1, 3, 3, 1},
56         {0, 0, 0, 1, 2, 1},
57         {0, 0, 0, 0, 1, 1},
58         {0, 0, 0, 0, 0, 1}
59     };
60
61     for(int i = 0; i < 6; i++)
62         for(int j = 0; j < 6; j++)
63             A.a[i][j] = a[i][j];
64
65     int T; scanf("%d", &T);
66     while(T--) {
67         scanf("%lld", &n);
68         if(n == 1) {
69             puts("1");
70             continue;
71         }
72         Matrix B = A ^ (n - 1);
73         LL ans = B.a[0][0] + B.a[0][2] * 8 + B.a[0][3] * 4 + B.a[0][4] * 2 + B.a[0][5];
74         ans %= mod;
75         printf("%lld\n", ans);
76     }
77     return 0;
78 }
79 /*
80 */

原文地址:https://www.cnblogs.com/CJLHY/p/8985606.html

时间: 2024-08-30 14:56:41

2018年湘潭大学程序设计竞赛 G- 又见斐波那契的相关文章

2018年湘潭大学程序设计竞赛 E 吃货

题目描述 作为一个标准的吃货,mostshy又打算去联建商业街觅食了.混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种美食.mostshy想知道,假如带t元去商业街,只能吃一种食物,能够品味到的美食的美味度最高是多少? 输入描述: 第一行是一个整数T(1 ≤ T ≤ 10),表示样例的个数.以后每个样例第一行是两个整数n,m(1 ≤ n,m ≤ 30000),表示美食的种类数与查询的次数.接下来n行,每行两个整数分

2018清华大学学生程序设计竞赛暨高校邀请赛

2018清华大学学生程序设计竞赛暨高校邀请赛 A. 绿绿与串串 solution 生成字符串的方式决定了:当字符串中的某个奇回文串的左端为开头,或右端为结尾时,这个奇回文串的中间的位置就是其中一个长度. 时间复杂度:\(O(n)\) B. 赛艇 solution 将路径也弄成一个矩阵,然后压位判断. 时间复杂度:\(O(\frac{1}{64}n^2m^2)\) F. 密码学第三次小作业 solution 一看它给了两个式子就知道不是暴力分解质因子. 中间有一个很特别的性质:\((e_1, e_

HDU6447 YJJ&#39;s Salesman 2018中国大学生程序设计竞赛 - 网络选拔赛1010 离散化+线段树+DP

YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 253    Accepted Submission(s): 62 Problem Description YJJ is a salesman who has traveled through western country. YJJ is always on

2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ&#39;s Salesman 【离散化+树状数组维护区间最大值】

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 919    Accepted Submission(s): 290 Problem Description YJJ is a salesman who h

2019年湘潭大学程序设计竞赛(重现赛)

2019年湘潭大学程序设计竞赛(重现赛) A:Who's better? #include<bits/stdc++.h> using namespace std; int main(){ int n1,p1,s1,n2,p2,s2; cin>>n1>>p1>>s1; cin>>n2>>p2>>s2; if(n1!=n2){ if(n1>n2)cout<<"1\n"; else cout

Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E. Excellent Engineers-单点更新、区间最值-线段树 G. Growling Gears I. Interesting Integers-类似斐波那契数列-递推思维题

先写这几道题,比赛的时候有事就只签了个到. E. Excellent Engineers 传送门: 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到名单中. 因为是3个变量,所以按其中一个变量进行sort排序,然后,剩下的两个变量,一个当位置pos,一个当值val,通过线段树的单点更新和区间最值操作,就可以把名单确定. 代码: 1 //E-线段树 2 #include<iostream> 3 #include<cstdio> 4 #incl

&quot;字节跳动杯&quot;2018中国大学生程序设计竞赛-女生专场 Solution

A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqrt {x}$ 的质因子用线段树维护 其他质因子用vector 维护存在性 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 #define block 317 6 vector <int>

HUST第八届程序设计竞赛-G小乐乐打游戏(双bfs)

题目描述 小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏.        最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩.        吃猪游戏很简单,给定一个地图,大小为n*m,在地图中会随机出现一个火山口,只要小乐乐能逃离这个地图,他便能吃猪!         但吃鸡远没有那么简单:        1.小乐乐每走一次只能上下左右四个方向中走一步.        2.小乐乐每走一步,火山喷发的岩浆就会向四周蔓延一个格子,所有岩浆走过的地方都视为被岩浆覆盖.       

2018中国大学生程序设计竞赛 - 网络选拔赛

传送门 A.HDU6438 Buy and Resell 题意 给你N天N个价格,每天都可以从1.买入一个,2.卖出一个,3.什么都不做,求最高获利 低买高卖问题,这题与其他的差距就是要在满足获利最多的情况下,买卖次数最小; 思路 手算一下发现价格具有传递性;例如数据是1,5,9; 5的时候买入1赚了4;9的时候买入5赚了4;相当于直接把5当成跳板直接9的时候买1;然后再把中间的5当成没有买过的; 建立一个小根堆(优先队列);把当前遇到的天数的价钱放入,然后对于第i天; 1.如果新天数的价钱比堆