Portal --> bzoj4002

Solution

​  虽然说这题有点强行但是感觉还是挺妙的,给你通项让你反推数列的这种==有点毒

​​  补档时间

​  首先有一个东西叫做特征方程,我们可以用这个东西来求二阶线性递推数列的通项:

​​  对于数列\(\{x_n\}\),递推公式为\(x_n=a_1x_{n-1}-a_2x_{n-2}\),那么这个数列的特征方程为:

\[x^2-a_1x+a_2=0
\]

​  如果说这个方程有两个相异的根\(p,q\),那么:

\[\begin{aligned}
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\),那么:

\[\begin{aligned}
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})^n+(\frac{b-\sqrt d}{2})^n-(\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\):

\[\begin{aligned}
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】有意义的字符串的更多相关文章

  1. luogu3263/bzoj4002 有意义的字符串 (数学+矩阵快速幂)

    首先我们发现$\frac{b+\sqrt{d}}{2}$这个形式好像一元二次方程的求根公式啊(???反正我发现不了) 然后我们又想到虽然这个东西不好求但是$(\frac{b-\sqrt{d}}{2}) ...

  2. 【BZOJ4002】[JLOI2015]有意义的字符串(数论,矩阵快速幂)

    [BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令\(A=\frac{b+\sqrt d}{2},B=\frac{ ...

  3. 【BZOJ4002】[JLOI2015]有意义的字符串 数学

    [BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...

  4. 【BZOJ】【4002】【JLOI2015】有意义的字符串

    构造线性递推式+矩阵乘法 题解戳PoPoQQQ 为了自己以后看的方便手打一遍好了>_> 求$( \frac{b+\sqrt{d}}{2} )^n$的整数部分对p取模后的值 其中$b\mod ...

  5. BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

    BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...

  6. BZOJ 4002--有意义的字符串(矩阵乘法)

    4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 963  Solved: 416[Submit][Sta ...

  7. [JLOI2015]有意义的字符串

    4002: [JLOI2015]有意义的字符串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1000  Solved: 436[Submit][St ...

  8. BZOJ4002 [JLOI2015]有意义的字符串 【数学 + 矩乘】

    题目链接 BZOJ4002 题解 容易想到\(\frac{b + \sqrt{d}}{2}\)是二次函数\(x^2 - bx + \frac{b^2 - d}{4} = 0\)的其中一根 那么就有 \ ...

  9. 【BZOJ4002】[JLOI2015]有意义的字符串 - 矩阵乘法

    题意: 给出b,d,n,求$\lfloor(\frac{b+\sqrt{d}}{2})^n\rfloor \mod 999999999999999989$(原题是7528443412579576937 ...

随机推荐

  1. katalon系列九:DEBUG调试功能

    Katalon Studio做为一个IDE,具有和其他IDE一样的Debug功能,可以让我们方便的调试代码.将脚本切换到Script模式,在你想设断点的行首双击,或右击选择:(Groovy)Toggl ...

  2. JMeter与WireShark

    最近在学习JMeter,刚学了一点皮毛,就掉入了WireShark的坑,我发现在学习的道路上就是不断的给自己挖坑,之前在学习LoadRunner的道路上,遇到的坑更大,就单纯的安装LR就耗费了两个星期 ...

  3. EasyUI tree 优化--点击文字折叠展开效果

    $(function () { $('#tree_menu').tree({ onSelect: function (node) { if (node.state == "closed&qu ...

  4. Hyperledger Fabric CouchDB as the State Database——使用CouchDB

    使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...

  5. 3.10-通过requests、BeautifulSoup、webbrowser模块的相关方法,爬取网页数据示例程序(一)

    import requests,bs4res=requests.get('https://www.hao123.com/')print('res对象的类型:',type(res))res.raise_ ...

  6. 美国警察iPhone数据线挡住歹徒子弹获救

    泡泡网手机频道11月1日 现在手机的功能越来越丰富,不仅可以接打电话.收发短信.玩游戏聊天,关键时刻还能救命.前天HTC手机再次忠心护主,让许多同学对HTC赞赏有加.而现在又有人捡了一条命,不过这次救 ...

  7. mysqldb下载地址

    mysqldb x64    https://pan.baidu.com/s/1dFJ3G0T x32及源码 https://pypi.python.org/pypi/MySQL-python/1.2 ...

  8. Java 学习笔记 ------第三章 基础语法

    本章学习目标: 认识类型与变量 学习运算符的基本使用 了解类型转换细节 运用基本流程语法 一.类型(基本类型) 所谓基本类型,就是在使用时,得考虑一下数据用多少内存长度存比较经济,利用程序语法告诉JV ...

  9. KNN算法之图像处理一

    KNN: 1.数据挖掘分类技术中最简单的方法之一. 2.也称为邻近算法,K最近邻分类算法 3.每个样本都可以用它最接近的k个邻居来代表 4.一般,距离使用欧式距离或曼哈顿距离(通常,k≤20) pyt ...

  10. bat获取当前日期的前一天

    批处理做这样的事情很麻烦,你可以用cscript来实现,比如把下面的内容保存为a.js文件:var d=new Date();d.setTime(d.getTime()-24*3600*1000);v ...