ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QDUOJ 你猜锋锋让不让你过(矩阵快速幂)

2019-06-28 21:30:16  阅读:157  来源: 互联网

标签:10 mat ll 矩阵 QDUOJ 猜锋锋 ans include Matrix


Description
已知
(题目中所提均为整数)
若 x<10 f(x) = x.
若 x>=10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10)
ai(0<=i<=9) 等于0或1
求 f(k)%m

Input
多组样例,k<=2e9 , m<=1e5
每组样例给定输入如下:
第一行两个整数 k m
下面一行是数组a的10个数,从a0到a9

Output
每组样例输出一个整数代表f(k)%m

Sample Input 1
10 9
1 1 1 1 1 0 0 0 0 0
20 18
0 0 0 0 0 1 1 1 1 1

Sample Output 1
8
10

在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long ll;
typedef struct{
	ll mat[15][15];
}Matrix;
Matrix ans, res;
ll k, m;

Matrix mul(Matrix a, Matrix b)
{
	Matrix c;
	memset(c.mat, 0, sizeof(c.mat));
	for (int i=0; i<10; i++){
		for (int j=0; j<10; j++){
			for (int k=0; k<10; k++)
				c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%m;
		}
	}
	return c;
}
ll quick_pow_mod(ll n)
{
	while(n){
		if (n&1)
			ans=mul(res, ans);
	//因为是如果n末尾为1,相乘后的结果又存回了ans;所以不需要单位阵处理n一开始末尾不是1的情况。
		res=mul(res, res);
		n>>=1;
	}
	return ans.mat[0][0]%m;
}
int main()
{
	memset(ans.mat, 0, sizeof(ans.mat));
	
	while(scanf("%lld %lld", &k, &m)!=EOF){
//		if (k<10){
//			printf("%lld\n", k%m);
//			continue;
//		}这样会RE,因为如果conintue了,后面的输入就进不去了 
		
		for (int i=0; i<10; i++)
			ans.mat[i][0]=9-i;
		memset(res.mat, 0, sizeof(res.mat));
		for (int j=0; j<10; j++){
			scanf("%lld", &res.mat[0][j]);
		}
		for (int i=1; i<10; i++)
			res.mat[i][i-1]=1;
		
		
		if(k<10)
	   		printf("%lld\n",k%m);
	   	else
	   		printf("%lld\n",quick_pow_mod(k-9));
	} 
	return 0;
}

标签:10,mat,ll,矩阵,QDUOJ,猜锋锋,ans,include,Matrix
来源: https://blog.csdn.net/weixin_42172261/article/details/94048102

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有