Week15-矩阵快速幂&字符串

A : 斐波那契数列

题目描述
斐波那契数列的定义如下:
图片1.png

给出 n,pn,p ,求出 f(n)%pf(n)%p 的值。

输入格式
第一行一个数 T(1\le T\le 100)T(1≤T≤100),表示数据组数。
接下来 TT 行,每行两个整数 n,p(1\le n\le 109,108\le p\le 10^9)n,p(1≤n≤10
9
,10
8
≤p≤10
9
)。

输出格式
输出 TT 行,表示每组数据的答案。

Case 1
Input
6
1 998244353
2 998244353
3 998244353
4 998244353
5 998244353
1000000000 998244353
Output
1
1
2
3
5
990450892

#include<iostream>
using namespace std;
long long mod;

class Mat{
public:
	long long m[2][2];
	Mat(int _a, int _b, int _c, int _d) {
		m[0][0] = _a; m[0][1] = _b;
		m[1][0] = _c; m[1][1] = _d;
	}
};

Mat multi(Mat& a,Mat& b) {
	Mat t(0, 0, 0, 0);
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 2; j++) {
			for (int k = 0; k < 2; k++) {
				t.m[i][j] = t.m[i][j] + a.m[i][k] * b.m[k][j];
				t.m[i][j] %= mod;
			}
		}
	}
	return t;
}
long long pow(long long p) {
	Mat t(1, 0, 0, 1);
	Mat c(1, 1, 1, 0);
	while (p) {
		if (p & 1)t = multi(t, c);
		c = multi(c, c);
		p /= 2;
	}
	return t.m[0][1];
}

int main() {
	int T;
	cin >> T;
	while (T--) {
		int n;
		cin >> n >> mod;
		
		long long ans = pow(n);
		cout << ans << endl;
	}
	return 0;
}

在这里插入图片描述

B : 自然数幂和

题目描述
给定 𝑛 和 𝑘,计算 \Sigma{n}_{i=1}i
i=1
n

i
k
对 10^9+710
9
+7 取模的结果。

输入格式
第一行一个数 T(1\le T\le 100)T(1≤T≤100),表示数据组数。
接下来 TT 行,每行两个整数 n,k(1\le n\le 10^9,1\le k\le 10)n,k(1≤n≤10
9
,1≤k≤10)。

输出格式
输出 TT 行,表示每组数据的答案。

Case 1
Input
6
1 10
2 2
2 3
3 2
3 3
1000000000 9
Output
1
5
9
14
36
12313161

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int n;//矩阵维数
struct Mat {
	long long m[101][101];
	void ini() {
		memset(m, 0, sizeof(m));
	}
	void ini_dw() {
		memset(m, 0, sizeof(m));
		for (int i = 0; i < n; i++)m[i][i] = 1;
	}
};

int mod=1e9+7;//模
Mat a, e;//a是输入矩阵 e是单位矩阵
Mat multi(Mat a, Mat b) {
	Mat c;
	c.ini();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				c.m[i][j] = ((c.m[i][j] % mod) + (a.m[i][k] * b.m[k][j]) % mod) % mod;
			}
		}
	}
	return c;
}

Mat pow(Mat x, long long y) {
	Mat ans;
	ans.ini_dw();
	//if (y == 0 )return ans;
    //if(y==1)return x;
	while (y) {
		if (y & 1)ans = multi(ans, x);
		x = multi(x, x);
		y /= 2;
	}
	return ans;
}

long long C(int n, int m)//排列函数即C 的个数
{
	if (n < m)return C(m, n);
	long long i, c = 1;
	i = m;
	while (i != 0)
	{
		c *= n; n--; i--;
	}
	while (m != 0)
	{
		c /= m; m--;
	}
	return c;
}

long long fastPower(long long base, long long power) {
	long long result = 1;
	while (power > 0) {
		if (power & 1) {//此处等价于if(power%2==1)
			result = result * base % 1000;
		}
		power >>= 1;//此处等价于power=power/2
		base = (base * base) % 1000;
	}
	return result;
}


int main() {
	int T;
	cin >> T;
	while (T--) {
		int m, k;
		cin >> m >> k;
		n = k + 2;
		Mat t;
        t.ini();
        t.m[0][0]=1;
		for(int i=1;i<n;i++)t.m[0][i]=C(k,i-1);
        for(int i=1;i<n;i++){
            for(int j=0;j<n;j++){
                if(i==j)t.m[i][j]=1;
                else if(i>j)t.m[i][j]=0;
                else if(i<j)t.m[i][j]=C(k+1-i,j-i);
            }
        }
        long long res[11];
		t = pow(t, m - 1);
		long long ans = 0;
		for (int i = 0; i < k + 2; i++) {
			ans = (ans+t.m[0][i])%mod;
            }

		cout <<ans << endl;
	}
	return 0;
}

在这里插入图片描述

C : R??G??B??

题目描述
msy 的“显示器”终于完工啦!但是由于设计出了问题,这个“显示器”存在一个严重的 bug,就是每个像素同时只能显示红色、绿色、蓝色其中的一种颜色。msy 感觉一个学期白忙活了,但是又不能浪费材料,于是他觉得把这个有问题的“显示器”作为装饰。msy 喜欢蓝色和绿色,同时也喜欢偶数,因此他希望“显示器”的每一帧都同时包含偶数个蓝色像素和偶数个绿色像素。此时 msy 想知道,他可以看到多少不同的帧?
由于答案可能很大,你只需输出答案对 998244353998244353 取模的结果即可。

输入格式
第一行一个数 T(1\le T\le 100)T(1≤T≤100),表示数据组数。
接下来 TT 行,每行一个整数 n(1\le n\le 10^9)n(1≤n≤10
9
),表示“显示器”上的像素个数。

输出格式
输出 TT 行,表示每组数据的答案。

Case 1
Input
6
1
2
3
4
5
1000000000
Output
1
3
7
21
61
224965630

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int n=3;//矩阵维数
struct Mat {
	long long m[101][101];
	void ini() {
		memset(m, 0, sizeof(m));
	}
	void ini_dw() {
		memset(m, 0, sizeof(m));
		for (int i = 0; i < n; i++)m[i][i] = 1;
	}
};

int mod = 998244353;//模
Mat a, e;//a是输入矩阵 e是单位矩阵
Mat multi(Mat a, Mat b) {
	Mat c;
	c.ini();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				c.m[i][j] = ((c.m[i][j] % mod) + (a.m[i][k] * b.m[k][j]) % mod) % mod;
			}
		}
	}
	return c;
}

Mat pow(Mat x, long long y) {
	Mat ans;
	ans.ini_dw();
	if (y == 0 )return ans;
	if (y == 1)return x;
	while (y) {
		if (y & 1)ans = multi(ans, x);
		x = multi(x, x);
		y /= 2;
	}
	return ans;
}


int main() {
	int T;
	cin >> T;
	while (T--) {
		int m;
		cin >> m;
		/*if (m == 2) {
			cout << 3 << endl;
			continue;
		}*/
		Mat t;
		t.m[0][0] = 1; t.m[0][1] = 0; t.m[0][2] = 1;
		t.m[1][0] = 0; t.m[1][1] = 1; t.m[1][2] = 1;
		t.m[2][0] = 2; t.m[2][1] = 2; t.m[2][2] = 1;
		t = pow(t, m - 1);
		long long ans = 0;
		ans = (ans%mod + t.m[0][0]%mod + (t.m[0][2] * 2)%mod) % mod;
		cout << ans << endl;
	}
	return 0;
}

在这里插入图片描述

D : 衣柜

题目描述
ZJM 有 mm 件衬衫,现一共有 nn 天。
如果 ZJM 昨天穿衬衫 AA,今天穿衬衫 BB,则他今天可以获得 H[A][B]H[A][B] 快乐值。
询问 nn 天过后,ZJM 最多可以获得多少快乐值?

输入格式
第一行两个数 n,m(2\le n\le 10^8, 1\le m\le 100)n,m(2≤n≤10
8
,1≤m≤100),表示总天数和衬衫数量。
接下来 mm 行,每行 mm 个数,第 ii 行的第 jj 个数表示 H[i][j](0\le H[i][j]\le 10^6)H[i][j](0≤H[i][j]≤10
6
),即昨天穿衬衫 ii,今天穿衬衫 jj 可以获得的快乐值。

输出格式
输出一个数表示答案。

Case 1
Input
3 2
0 1
1 0
Output
2

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int n;//矩阵维数
struct Mat {
	long long m[101][101];
	void ini() {
		memset(m, 0, sizeof(m));
	}
	void ini_dw() {
		memset(m, 0, sizeof(m));
		for (int i = 0; i < n; i++)m[i][i] = 1;
	}
};



Mat multi(Mat a, Mat b) {
	Mat c;
	c.ini();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < n; k++) {
				c.m[i][j] = max(c.m[i][j],a.m[i][k] + b.m[k][j]);
			}
		}
	}
	return c;
}

Mat pow(Mat x, long long y) {
	Mat ans;
	ans.ini_dw();
	ans = x;
	while (y) {
		if (y & 1)ans = multi(ans, x);
		x = multi(x, x);
		y /= 2;
	}
	return ans;
}

int main() {
	int m;
	cin >> m >> n;
	Mat t;
	t.ini();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> t.m[i][j];
		}
	}
	t = pow(t, m-2);
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			ans = max(ans, t.m[i][j]);
		}
	}
	cout << ans << endl;
}

在这里插入图片描述

思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不会太难的地方,但是有和去年差不多的题目,斐波那契这题网上好多解释,自己改改就行了。
其他题可以看看扩展资料
这里是资料
里面例题能学到一些东西,但是自己做还是有差距的,挺多地方得看着别人的代码想。
主要讲了字典树和KMP还有哈希,都没啥时间去理解了,赶紧准备考试了。希望能做出来两道题。
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于心脏病预测的问题,使用循环神经网络(RNN)是一种常见的方法。RNN适用于处理序列数据,而心电图信号就是一种序列数据。在使用RNN进行心脏病预测时,你可以将心电图信号作为输入序列,然后通过训练RNN模型来预测患者是否患有心脏病。 首先,你需要准备一个合适的数据集,其中包含心电图信号和相应的心脏病标签。可以使用公开的心电图数据集,如PTB数据库或MIT-BIH数据库。然后,你可以对数据进行预处理和特征工程,如数据清洗、滤波、降采样等。 接下来,你可以构建一个RNN模型。RNN模型由一系列循环层组成,每个循环层都会处理一个时间步的输入数据。你可以选择不同类型的RNN单元,如简单循环单元(SimpleRNN)、长短期记忆网络(LSTM)或门控循环单元(GRU)。通过添加适当的全连接层和激活函数,你可以将RNN模型输出映射到二分类问题(有或无心脏病)的结果。 然后,你可以使用训练集对RNN模型进行训练,并使用验证集进行模型调优。在训练过程中,你可以使用适当的损失函数(如交叉熵)和优化算法(如随机梯度下降)来最小化模型的预测误差。 最后,你可以使用测试集对训练好的模型进行评估,并计算模型的性能指标,如准确率、精确率、召回率等。这些指标可以帮助你评估模型的预测能力和泛化能力。 需要注意的是,心脏病预测是一个复杂的医学问题,仅仅使用心电图信号可能不能得到准确的预测结果。通常情况下,还需要结合其他患者的临床信息和医学知识来进行综合评估。因此,在进行心脏病预测时,建议与专业医生合作,并遵循相关的医学准则和规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值