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--有意义的字符串(矩阵乘法)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4002[JLOI2015]有意义的字符串 数论+矩阵乘法

[JLOI2015]有意义的字符串

bzoj4002[JLOI2015]有意义的字符串

bzoj 4002: [JLOI2015]有意义的字符串

luogu P3263 [JLOI2015]有意义的字符串

JLOI2015 DAY1 简要题解