JLOI 2015--有意义的字符串(矩阵乘法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JLOI 2015--有意义的字符串(矩阵乘法)相关的知识,希望对你有一定的参考价值。
知道公式就不难了系列。。。
感觉吉林省选好变态。。。这还只是第一题呀。。。
%dalaoPoPoQQQ。。。
看了大佬的题解。。。懵逼了一晚。。。
今天早上的时候终于想明白了!!!
于是飞快地A过此题。。。
题意
B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求
注意:其中 0<b^2< = d<(b+1)^2< = 10^18, n< = 10^18,并且 b mod 2=1,d mod 4=1
Solution
构造特征方程。。。构造矩阵。。。全靠YY(mdzz。。。
公式推导直接点下面的链接吧。。。特殊字符好难打。。。
再次%dalaoPoPoQQQ。。。
公式之后还要注意mod的值很大要用unsigned long long。。。
还有乘法要用快速乘,直接乘会爆炸。。。
想通了公式后再做这题就不难了。。。
代码
#include<iostream> #include<cstdio> #define LL long long #define ULL unsigned long long #define mod 7528443412579576937 using namespace std; ULL qui(ULL a,ULL b){ ULL s=0; while(b){ if(b&1) s=(s+a)%mod; b>>=1; a=(a+a)%mod; } return s; } struct jz{ ULL x[2][2]; friend jz operator *(const jz &a,const jz &b){ jz tmp; for(int i=0;i<2;i++) for(int j=0;j<2;j++){ tmp.x[i][j]=0; for(int k=0;k<2;k++) tmp.x[i][j]=(tmp.x[i][j]+qui(a.x[i][k],b.x[k][j]))%mod; } return tmp; } }A,T; void pow(ULL z){ while(z){ if(z&1) T=T*A; z>>=1; A=A*A; } } int main(){ ULL b,d,n,b2,f=0; cin>>b>>d>>n; if(n==0){ printf("1\\n"); return 0; } b2=qui(b,b); A.x[0][0]=b;A.x[0][1]=1;A.x[1][0]=((d-b2)/4)%mod;A.x[1][1]=0; T.x[0][0]=b;T.x[0][1]=2;T.x[1][0]=0;T.x[1][1]=0; pow(n-1); if(d!=b2&&n%2==0) f=1; T.x[0][0]=(T.x[0][0]-f+mod)%mod; cout<<T.x[0][0]<<endl; return 0; }
This passage is made by Yukino.
以上是关于JLOI 2015--有意义的字符串(矩阵乘法)的主要内容,如果未能解决你的问题,请参考以下文章