hdu6395 Sequence 2018杭电多校第7场1010 【矩阵快速幂+分块】

题目链接

题意:

给你A, B, C, D, p, n这些条件

通过公式

请你推出第n项答案(mod1e9+7)

题解: 有前面几项推出后一项的公式一般都是用矩阵快速幂来求, 主要是p/n难以进行操作,那么我们便根据p/n的值来进行分块

例如 p = 16  n = 55

分块可分为 :

p/3 = 5          3

p/4 = 4          4

p/5 = 3          5

p/6 = 2          6 , 7 , 8

p/9 = 1          9 , 10 , 11, 12, 13, 14, 15, 16 

p/17 = 0       17 ........55 

以此类推在这些区间内的p/i的值不变

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int mod = 1e9+7;
int A, B, C, D, n, p;

struct Matrix{
	int t[3][3];
	Matrix(){
		memset(t, 0, sizeof(t));//初始化都为0 
	}
}mat; 

Matrix operator * (Matrix aa, Matrix bb){//定义矩阵相乘 
	Matrix cc;
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			ll ans = 0;
			for(int k = 0; k < 3; k++){
				ans += (ll)aa.t[i][k]*bb.t[k][j];
			}
			cc.t[i][j] = ans%mod;
		}
	}
	return cc; 
}

Matrix QuickPow(Matrix aa, int b){//快速幂 
	Matrix cc = mat;
	while(b){
		if(b&1){
			cc = cc*aa;
		}
		aa = aa*aa;
		b>>=1;
	}
	return cc;
}
 
int main() {
	mat.t[0][0] = mat.t[1][1] = mat.t[2][2] = 1;
		/**
		1 0 0
		0 1 0
		0 0 1
		矩阵快速幂所用的单位矩阵 
		**/
	int t;
	scanf("%d", &t);
	while(t--){
		scanf("%d%d%d%d%d%d",&A, &B, &C, &D, &p, &n);
		if(n == 1){
			printf("%d\n",A);
			continue;
		}
		Matrix f;
		f.t[0][0] = D;//   D C 0 
		f.t[0][1] = C;//   1 0 0 
		f.t[1][0] = 1;//   0 0 1
		f.t[2][2] = 1;
		int flag = 0;
		
		for(int i = 3; i <= n;){
			if(p/i == 0){//当i > p 时,p/i = 0 
				Matrix w = f;
				w = QuickPow(w, n-i+1);
				printf("%d\n",(w.t[0][0]*(ll)B+w.t[0][1]*(ll)A+w.t[0][2])%mod);
				flag = 1;
				break;
			}
			int j = min(n, p/(p/i));//分块 
			Matrix w = f;
			/**
			D C p/i       B       B*D+A*C+p/i
			1 0 0     *   A   =   B
			0 0 1         1       1
			**/
			w.t[0][2] = p/i;//在这个区间内 p/i的值不会变 
			w = QuickPow(w, j-i+1);
			ll a = (w.t[1][0]*(ll)B + w.t[1][1]*(ll)A + w.t[1][2]) % mod;
			ll b = (w.t[0][0]*(ll)B + w.t[0][1]*(ll)A + w.t[0][2]) % mod;
			A = a;
			B = b;
			i = j+1;
		}
		if(flag){
			continue;
		}
		printf("%d\n", B); 
	}
	return 0;
}

 

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务