BZOJ2326 矩阵 快速幂

今天来机房。。看到他们在讨论**题,就凑了个热闹=w=

然后就第一个写出来了=w=

这道题我们可以写成这样的转移:

F[I]:=F[I-1]*10^K+I

K最多18次

我们就做18次就可以了..然后我们稍微推一推就能知道发现

原矩阵是1*3的矩阵.,用F表示

转移矩阵是3*3的矩阵,用G表示

F的初始状态是1(每次I增加1) 0(I目前是0) 0(答案)

G是

1 1 1

0 1 1
0 0 10^k

这个自己算算就晓得了=w=

然后就不停的做= - =

每次做10^k-10^(k-1)次方

做到N为止。细节自己推一推啦啦啦啦啦啦=w=


code(pascal)

略丑QAQ



var
  t,k,n,m,p,tmp:int64;
  i,j,a,b,c:longint;
  g,f,y,e:array[0..4,0..4] of int64;
  flag:boolean;
begin
  read(n,m);
  f[1,1]:=1;f[1,2]:=0;f[1,3]:=0;
  k:=1;
  for i:=1 to 18 do
    begin
	  k:=k*10;	  
	  fillchar(g,sizeof(g),0);
      g[1,1]:=1;g[1,2]:=1;g[1,3]:=1;
      g[2,2]:=1;g[2,3]:=1;g[3,3]:=(k mod m);
	  t:=k-1;
	  fillchar(y,sizeof(y),0);
	  for j:=1 to 3 do
	    y[j,j]:=1;
	  if t<=n then p:=k-(k div 10) else begin p:=n-(k div 10)+1;flag:=true;end;
	  while p<>0 do
	    begin
		  if (p mod 2)=1 then
		    begin
			  fillchar(e,sizeof(e),0);
			  for a:=1 to 3 do
			    for b:=1 to 3 do
				  for c:=1 to 3 do
				    begin
					  tmp:=(y[a,b]*g[b,c]) mod m;
					  tmp:=(e[a,c]+tmp) mod m;
					  e[a,c]:=(tmp) mod m;
					end;
			  for a:=1 to 3 do
			    for b:=1 to 3 do
				  y[a,b]:=(e[a,b]) mod m;
			end;
		  fillchar(e,sizeof(e),0);
		  for a:=1 to 3 do
		    for b:=1 to 3 do
			  for c:=1 to 3 do
			    begin
				  tmp:=(g[a,b]*g[b,c]) mod m;
				  tmp:=(e[a,c]+tmp) mod m;
				  e[a,c]:=tmp;
				end;
		  for a:=1 to 3 do
		    for b:=1 to 3 do
			  g[a,b]:=e[a,b];
		  p:=p div 2;
		end;
	  fillchar(e,sizeof(e),0);
	  for a:=1 to 3 do
	    for b:=1 to 3 do
	      begin
		    tmp:=(f[1,a]*y[a,b]) mod m;
			tmp:=(tmp+e[1,b]) mod m;
			e[1,b]:=tmp;
		  end;
	  for a:=1 to 3 do
		  f[1,a]:=e[1,a];
	  if flag then break;
    end;
  writeln(f[1,3]);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值