【bzoj4002】有意义的字符串
Solution
 虽然说这题有点强行但是感觉还是挺妙的,给你通项让你反推数列的这种==有点毒
 补档时间
 首先有一个东西叫做特征方程,我们可以用这个东西来求二阶线性递推数列的通项:
 对于数列\(\{x_n\}\),递推公式为\(x_n=a_1x_{n-1}-a_2x_{n-2}\),那么这个数列的特征方程为:
\]
 如果说这个方程有两个相异的根\(p,q\),那么:
A&=\frac{x_2-qx_1}{p(p-q)}\\
B&=\frac{px_1-x_2}{q(p-q)}\\
x_n&=Ap^n+Bq^n
\end{aligned}
\]
 如果有两个相等的根\(p\),那么:
A=\frac{px_1-x_2}{p^2}\\
B=\frac{x_2-px_1}{p^2}\\
x_n=(A+Bn)p^n
\end{aligned}
\]
 
 然后我们看回这题
 有个奇奇怪怪的条件:$b^2< = d<(b+1)^2 $,这个条件说明什么呢?会发现因为这个条件所以\(0>=\frac{b-\sqrt d}{2}>-0.5\)
 但是我们要求的是\(\lfloor(\frac{b+\sqrt d}{2})^n\rfloor\),那么这个时候我们会发现。。其实我们把这个式子稍微变一下变成:
\]
 就好了
 为什么变成这样呢?首先前面那个东西,我们会发现其实就是。。用特征方程中有相异两根求出的通项式的类似形式,所以我们只要令这两个根为\((\lfloor \frac{b+\sqrt d}{2}\rfloor)^n\)和\((\lfloor \frac{b-\sqrt d}{2}\rfloor)^n\)就好了,然后\(A\)和\(B\)这两个系数要为\(1\),这样我们就可以求出\(x_1\)和\(x_2\)和\(a_1\)和\(a_2\):
p&=\frac{b+\sqrt d}{2}&&q=\frac{b-\sqrt d}{2}\\
x_1&=p+q&&x_2=p^2+q^2\\
a_1&=b&&a_2=\frac{b^2-d}{4}
\end{aligned}
\]
 然后!因为题目的条件: b mod 2=1,d mod 4=1 ,所以我们发现\(a_1\)和\(a_2\)都是整数,\(x_1\)和\(x_2\)也都是整数,所以!前半部分的答案一定是一个整数(然而其实好像可以直接用一个叫做共轭根式的东西说明但是我不太会那个东西qwq)
 然后这个时候如果是要求那个式子的下取整的话我们直接判断一下\(\frac{b-\sqrt d}{2}\)是否大于等于\(1\)即可,会发现只有在\(n\)是偶数并且\(b^2\neq d\)的情况下减去这个部分会导致整体的下取整少一,特判一下就好了
 至于前半部分直接矩阵快速幂求出\(x_n\)即可
 然后最后还有一个小问题,就是。。这个模数有点令人难受
 这个时候我们需要。。一个小技巧来处理一下加法和乘法:加法的话直接就先减去一个模数然后如果小于\(0\)再加上模数,乘法的话就像快速幂一样处理就好了
 代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const ll MOD=7528443412579576937;
ll add(ll x,ll y){
	ll tmp=-MOD+x+y;
	if (tmp<0) tmp+=MOD;
	return tmp;
}
ll mul(ll x,ll y){
	ll ret=0;
	for (;y;y>>=1,x=add(x,x))
		if (y&1) ret=add(ret,x);
	return ret;
}
struct Mtrix{/*{{{*/
	ll a[2][2];
	void init(){memset(a,0,sizeof(a));}
	void setUnit(){for (int i=0;i<2;++i) for (int j=0;j<2;++j) a[i][j]=i==j;}
	friend Mtrix operator * (Mtrix x,Mtrix y){
		Mtrix ret;
		for (int i=0;i<2;++i)
			for (int j=0;j<2;++j){
				ret.a[i][j]=0;
				for (int k=0;k<2;++k)
					ret.a[i][j]=add(ret.a[i][j],mul(x.a[i][k],y.a[k][j]));
			}
		return ret;
	}
}ori,ret,base,ans;/*}}}*/
ll n,m,Ans,d,b;
void ksm(ll y){
	ret.setUnit(); base=ori;
	for (;y;y>>=1,base=base*base)
		if (y&1) ret=ret*base;
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
#endif
	scanf("%lld%lld%lld\n",&b,&d,&n);
	if (n==0){printf("1\n");return 0;}
	ori.init();
	ori.a[1][1]=b;ori.a[0][1]=-(b*b-d)/4;
	ori.a[1][0]=1;
	ans.init();
	ans.a[0][0]=b; ans.a[0][1]=(b*b+d)/2;
	if (n>=2)
		ksm(n-2),ans=ans*ret;
	if (n==1) Ans=ans.a[0][0];
	else Ans=ans.a[0][1];
	if (b*b!=d&&n%2==0) Ans=add(Ans,MOD-1);
	printf("%lld\n",Ans);
}
【bzoj4002】有意义的字符串的更多相关文章
- luogu3263/bzoj4002 有意义的字符串 (数学+矩阵快速幂)
		
首先我们发现$\frac{b+\sqrt{d}}{2}$这个形式好像一元二次方程的求根公式啊(???反正我发现不了) 然后我们又想到虽然这个东西不好求但是$(\frac{b-\sqrt{d}}{2}) ...
 - 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)
		
[BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...
 - 【BZOJ4002】[JLOI2015]有意义的字符串 数学
		
[BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...
 - 【BZOJ】【4002】【JLOI2015】有意义的字符串
		
构造线性递推式+矩阵乘法 题解戳PoPoQQQ 为了自己以后看的方便手打一遍好了>_> 求$( \frac{b+\sqrt{d}}{2} )^n$的整数部分对p取模后的值 其中$b\mod ...
 - BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法
		
BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...
 - BZOJ 4002--有意义的字符串(矩阵乘法)
		
4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 963 Solved: 416[Submit][Sta ...
 - [JLOI2015]有意义的字符串
		
4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1000 Solved: 436[Submit][St ...
 - BZOJ4002 [JLOI2015]有意义的字符串  【数学 + 矩乘】
		
题目链接 BZOJ4002 题解 容易想到\(\frac{b + \sqrt{d}}{2}\)是二次函数\(x^2 - bx + \frac{b^2 - d}{4} = 0\)的其中一根 那么就有 \ ...
 - 【BZOJ4002】[JLOI2015]有意义的字符串 - 矩阵乘法
		
题意: 给出b,d,n,求$\lfloor(\frac{b+\sqrt{d}}{2})^n\rfloor \mod 999999999999999989$(原题是7528443412579576937 ...
 
随机推荐
- Git生成多个ssh key
			
在实际的工作中, 有可能需要连接多个远程仓库, 例如我想连接私有仓库.GitLab官网.GitHub官网, 那么同一台电脑就要生成多个ssh key: ssh-keygen -t rsa -C &qu ...
 - 第一篇:一天学会MongoDB数据库之Python操作
			
本文仅仅学习使用,转自:https://www.cnblogs.com/suoning/p/6759367.html#3682005 里面新增了如果用用Python代码进行增删改查 什么是MongoD ...
 - 面向 Unity* 软件和虚拟现实的优化:运行时生成内容
			
优化游戏以实现高性能一直是游戏开发过程中的一个重要因素.虽然开发人员一直尝试将硬件推向极致,但当移动游戏成为主流时,优化技术变得尤为突出.Unity* 软件.Unreal* 等常见引擎最初都是面向 P ...
 - 3星|麦肯锡合伙人《从1到N》:PPT讲稿,图表不错,讲解不够深入
			
从1到N:企业数字化生存指南 两位作者是麦肯锡合伙人.全书插图比较多,图做的还比较有水平.但是相关文字不够深入,我读后的感觉是:图表不是两位执笔者做的,他们对细节不清楚,对图表涉及到的行业也缺乏深入的 ...
 - centos7挂载Windows共享文件夹(学习笔记)
			
centos7挂载windows共享文件夹 练习环境:centos7是安装在台式机的虚拟机,Windows共享文件夹是公司服务器的共享文件夹(已设置好的共享) 步骤 1. 设置挂载点:mkdir /m ...
 - linux 下 mysql安装和配置
			
最近在学习R语言,看到R与数据库交互这一部分,就自己动手实践了一下,数据库选择的是mysql,主要记录下linux下怎么安装mysql. 网上的很多资料都有相关的文章,这里只是记录下自己安装过程中遇到 ...
 - Maven私有仓库搭建以及使用
			
一.使用Docker安装Nexus Docker search nexus docker pull docker.io/sonatype/nexus3 mkdir -p /usr/local/nexu ...
 - CSS中水平居中设置的几种方式
			
1.行内元素: 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的. <body> <div class="t ...
 - textarea中文提交乱码问题解决
			
在A.jsp中有如下语句: <textarea rows="10" cols="30" name="texts"><%=r ...
 - ASP.NET Core 中的 Razor 页面介绍
			
标题:ASP.NET Core 中的 Razor 页面介绍 地址:https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/index?view ...