蓝桥杯 算法提高 递推求值

思路:

矩阵快速幂。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5
 6 typedef long long ll;
 7 typedef vector<ll> vec;
 8 typedef vector<vec> mat;
 9
10 const int mod = 99999999;
11
12 mat mul(mat & a, mat & b)
13 {
14     mat c(a.size(), vec(b[0].size()));
15     for (int i = 0; i < a.size(); i++)
16     {
17         for (int k = 0; k < b.size(); k++)
18         {
19             for (int j = 0; j < b[0].size(); j++)
20             {
21                 c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % mod;
22             }
23         }
24     }
25     return c;
26 }
27
28 mat pow(mat a, ll n)
29 {
30     mat b(a.size(), vec(a.size()));
31     for (int i = 0; i < a.size(); i++)
32     {
33         b[i][i] = 1;
34     }
35     while (n > 0)
36     {
37         if (n & 1)
38             b = mul(b, a);
39         a = mul(a, a);
40         n >>= 1;
41     }
42     return b;
43 }
44
45 int main()
46 {
47     mat F(7, vec(1));
48     F[0][0] = 6;
49     F[1][0] = 1;
50     F[2][0] = 2;
51     F[3][0] = 5;
52     F[4][0] = 4;
53     F[5][0] = 3;
54     F[6][0] = 1;
55     ll n;
56     cin >> n;
57     if (n <= 3)
58     {
59         printf("%d\n", F[3-n][0]);
60         printf("%d\n", F[5-(n-1)][0]);
61         return 0;
62     }
63     mat x(7, vec(7));
64     for (int i = 0; i < 7; i++)
65     {
66         for (int j = 0; j < 7; j++)
67         {
68             x[i][j] = 0;
69         }
70     }
71     x[0][2] = 2;
72     x[0][3] = 1;
73     x[0][6] = 5;
74     x[1][0] = 1;
75     x[2][1] = 1;
76     x[3][0] = 1;
77     x[3][2] = 3;
78     x[3][5] = 2;
79     x[3][6] = 3;
80     x[4][3] = 1;
81     x[5][4] = 1;
82     x[6][6] = 1;
83     mat res(7, vec(7));
84     res = pow(x, n - 3);
85     mat fuck(7, vec(1));
86     fuck = mul(res, F);
87     printf("%d\n", fuck[0][0]);
88     printf("%d\n", fuck[3][0]);
89     return 0;
90 }
时间: 2024-10-21 04:09:02

蓝桥杯 算法提高 递推求值的相关文章

递推求值【快速幂矩阵】

递推求值 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2   输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=10000000

NYOJ-301递推求值

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=

NYOJ——301递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值. 其中0<=f(1),f(2)<100,-100<=

蓝桥杯——算法提高 最小方差生成树

一.思路 枚举所有生成树的边权和值,对每一个枚举的边权和值sum,修改所有边的边权为(es[i].cost - sum * 1.0 / (N - 1))2,即方差公式的分子,然后跑最小生成树算法,同时记录边的原来的权值和,如果求出的“最小方差”生成树的边权值和为sum,那么,用这个"最小方差"去更新答案. 二.复杂度分析 时间复杂度:O(N * W * M * logM).N * W为枚举边权和值的时间.边权和值最小为0,最大为(N - 1) * W. 三.PS 这题据说蓝桥杯官网数据

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

蓝桥杯- 算法提高 逆序排列

算法提高 逆序排列 时间限制:1.0s   内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存放,并打印出来.例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的值按逆序重新存放,即变成了2 6 -5 19 7,然后把它们打印出来. 输入格式:输入只有一行,由若干个整数组成,

【蓝桥杯】历届试题 公式求值

  历届试题 公式求值   时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于1

蓝桥杯 算法提高 6-17 复数四则运算

算法提高 6-17复数四则运算 时间限制:1.0s   内存限制:512.0MB 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符分隔:输出时按a+bi的格式在屏幕上打印结果.参加样例输入和样例输出. 注意考虑特殊情况,无法计算时输出字符串"error". 样例输入 2 4 * -3 2 样例输出 -14-8i 样例输入 3 -2 + -1 3 样例输出 2+1i 1 #include<iostream> 2 #inc

蓝桥杯 算法提高 道路和航路 满分AC ,SPFA算法的SLF优化,测试数据还是比较水的,貌似没有重边

算法提高 道路和航路 时间限制:1.0s   内存限制:256.0MB 问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连. 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci.每一条公路,Ci的范围为0<=Ci<=10,000:由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000