码迷,mamicode.com
首页 > 其他好文 > 详细

JLOI 2015--有意义的字符串(矩阵乘法)

时间:2017-08-18 09:43:26      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:com   --   his   构造   有趣的   main   bsp   sig   乘法   

        知道公式就不难了系列。。。

        感觉吉林省选好变态。。。这还只是第一题呀。。。

        %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--有意义的字符串(矩阵乘法)

标签:com   --   his   构造   有趣的   main   bsp   sig   乘法   

原文地址:http://www.cnblogs.com/Yuigahama/p/7387623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!