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;
}

 

全部评论

相关推荐

想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
最终还是婉拒了小红书的offer,厚着脸皮回了字节。其实这次字节不管是组内的氛围、HR的沟通体验,都比之前好太多,开的薪资也还算过得去,这些都是让我下定决心的原因之一。但最核心的,还是抵不住对Agent的兴趣,选择了Ai&nbsp;Coding这么一个方向。因为很多大佬讲过,在未来比较火的还是属于那些更加垂类的Agent,而Ai&nbsp;Coding恰好是Coding&nbsp;Agent这么一个领域,本质上还是程序员群体和泛程序员群体这个圈子的。目前也已经在提前实习,也是全栈这么一个岗位。就像最近阿里P10针对前端后端等等不再那么区分,确实在Agent方向不太区分这个。尤其是我们自己做AI&nbsp;Coding的内容,基本上90%左右的内容都是AI生成的,AI代码仓库贡献率也是我们的指标之一。有人说他不好用,那肯定是用的姿态不太对。基本上用对Skill、Rules&nbsp;加上比较好的大模型基本都能Cover你的大部分需求,更别说Claude、Cursor这种目前看来Top水准的Coding工具了(叠甲:起码在我看来是这样)。所以不太区分的主要原因,还是针对一些例如Claude&nbsp;Code、Cursor、Trae、Codex、CC等一大堆,他们有很多新的概念和架构提出,我们往往需要快速验证(MVP版本)来看效果。而全栈就是这么快速验证的一个手段,加上Ai&nbsp;Coding的辅助,目前看起来问题不大(仅仅针对Agent而言)。而且Coding的产品形态往往是一个Plugin、Cli之类的,本质还是属于大前端领域。不过针对业务后端来看,区分还是有必要的。大家很多人也说Agent不就是Prompt提示词工程么?是的没错,本质上还是提示词。不过现在也衍生出一个新的Context&nbsp;Eneering,抽象成一种架构思想(类比框架、或者你们业务架构,参考商品有商品发布架构来提效)。本质还是提示词,但是就是能否最大化利用整个上下文窗口来提升效果,这个还是有很多探索空间和玩法的,例如Cursor的思想:上下文万物皆文件,&nbsp;CoWork之类的。后续也有一些Ralph&nbsp;Loop啥的,还有Coding里面的Coding&nbsp;Act姿态。这种才是比较核心的点,而不是你让AI生成的那提示词,然后调用了一下大模型那么简单;也不是dify、LangGraph搭建了一套workflow,从一个node走到另外一个node那么简单。Agent和WorkFLow还是两回事,大部分人也没能很好的区分这一点。不过很多人说AI泡沫啥啥啥的,我们ld也常把这句话挂在嘴边:“说AI泡沫还是太大了”诸如此类。我觉得在AI的时代,懂一点还是会好一点,所以润去字节了。目前的实习生活呢,除了修一些Tools的问题,还包括对比Claude、Cursor、Trae在某些源码实现思想上的点,看看能不能迁移过来,感觉还是比较有意思。不过目前组内还是主要Follow比较多,希望下一个阶段就做一些更有创新的事情哈哈。这就是一个牛马大学生的最终牧场,希望能好好的吧。说不定下次发的时候,正式AI泡沫结束,然后我又回归传统后端这么一个结局了。欢迎交流👏,有不对的🙅不要骂博主(浅薄的认知),可以私聊交流
聪明的芭乐等一个of...:佬可以推荐一些和aicoding相关的学习资料吗?最近特别想学习这个方向
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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