【BZOJ】4002: [JLOI2015]有意义的字符串

时间:2022-01-21 19:23:48

题意

求$\left \lfloor \left( \frac{b+\sqrt{d}}{2} \right)^n \right \rfloor \pmod {7528443412579576937} \(,\)\left( 0 \le n \le 10^{18}, 0 < b^2 \le d < (b+1)^2 \le 10^{18}, b \mbox{ mod } 2 = 1, d \mbox{ mod } 4=1 \right) $

分析

发现这个并不好算,而如果是\(\left( \frac{b-\sqrt{d}}{2} \right)^n\)那么就好算了。于是又想到数列的特征方程得到的解\(a_n = c_1 x_1^n + c_2 x_2^n\),于是我们搞搞。直接将\(c_1 = c_2 = 1\),则变成\(a_n = x_1^n + x_2^n\),而我们知道\(x_1、x_2\)是特征方程的两个解,和上面那个形式极为相似,于是我们继续假设。即\(x_1 = \left( \frac{b+\sqrt{d}}{2} \right), x_2 = \left( \frac{b-\sqrt{d}}{2} \right)\)。则\(a_{n+2} = pa_{n+1} + qa_{n}\)中,\(p = x_1 + x_2, q = - x_1 x_2\),因此得到\(a_{n+2} = ba_{n+1} - \frac{b^2-d}{4}a_{n}\)

题解

根据上面这个递推式,我们容易算出其中两项,容易得到\(a_1 = b, a_2 = \frac{b^2+d}{2}\)。而发现通项求出来的是整数,因此我们用矩阵乘法求出\(a_n\)即可。最后再根据条件特判一下\(\left( \frac{b-\sqrt{d}}{2} \right)^n\)即可,即\(ans = a_n - [b^2 \neq d \land n是偶数]\)

注意n=0要特判...

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
typedef ll mtx[2][2];
const ll mo=7528443412579576937ull, Lim=1e9;
inline void CK(ll &c) {
if(c>=mo)
c-=mo;
}
inline ll mul(ll a, ll b) {
if(a<=Lim && b<=Lim) {
return a*b;
}
if(a<b) {
swap(a, b);
}
ll c=0;
for(; b; b>>=1, CK(a<<=1)) {
if(b&1) {
CK(c+=a);
}
}
return c;
}
void mul(mtx a, mtx b, mtx c, int la, int lb, int lc) {
static mtx t;
memset(t, 0, sizeof t);
for(int i=0; i<la; ++i) {
for(int j=0; j<lc; ++j) {
for(int k=0; k<lb; ++k) {
CK(t[i][j]+=mul(a[i][k], b[k][j]));
}
}
}
memcpy(c, t, sizeof t);
}
ll b, d, n;
bool spj(ll n) {
if(n==1) {
printf("%lld\n", (ll)((((double)b+sqrt(d))/2.0)));
}
else if(n==2) {
printf("%lld\n", (b*b+d)/2);
}
return n<=2;
}
mtx a, c;
int main() {
scanf("%lld%lld%lld", &b, &d, &n);
if(spj(n)) {
return 0;
}
ll t1=b, t2=(d-b*b)/4;
CK(t1), CK(t2);
a[0][0]=t1, a[0][1]=1;
a[1][0]=t2, a[1][1]=0;
c[0][0]=c[1][1]=1;
for(ll tt=n-2; tt; tt>>=1, mul(a, a, a, 2, 2, 2)) {
if(tt&1) {
mul(c, a, c, 2, 2, 2);
}
}
ll a2=(b*b+d)/2, a1=b;
CK(a1), CK(a2);
ll ans;
CK(ans=mul(a2, c[0][0])+mul(a1, c[1][0]));
if(b*b!=d && (n&1)==0) {
if(ans==0) {
ans=mo-1;
}
else {
ans--;
}
}
printf("%llu\n", ans);
return 0;
}

【BZOJ】4002: [JLOI2015]有意义的字符串的更多相关文章

  1. bzoj 4002&colon; &lbrack;JLOI2015&rsqb;有意义的字符串

    这个题... #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define d ...

  2. &lbrack;JLOI2015&rsqb;有意义的字符串

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

  3. 【BZOJ4002】&lbrack;JLOI2015&rsqb;有意义的字符串(数论,矩阵快速幂)

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

  4. BZOJ&lowbar;4002&lowbar;&lbrack;JLOI2015&rsqb;有意义的字符串&lowbar;矩阵乘法

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

  5. 【BZOJ4002】&lbrack;JLOI2015&rsqb;有意义的字符串 数学

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

  6. BZOJ4002 &lbrack;JLOI2015&rsqb;有意义的字符串

    据说这两场加起来只要170= =而这是最简单的题目了QAQ 看到$(\frac {b + \sqrt {d} } {2} )^n$,第一反应是共轭根式$(\frac {b - \sqrt {d} } ...

  7. 【BZOJ4002】&lbrack;JLOI2015&rsqb;有意义的字符串 - 矩阵乘法

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

  8. bzoj4002 &lbrack;JLOI2015&rsqb;有意义的字符串 特征根&plus;矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4002 题解 神仙题. 根据下面的一个提示: \[ b^2 \leq d \leq (b+1)^ ...

  9. &lbrack;BZOJ4002&rsqb;&lbrack;JLOI2015&rsqb;有意义的字符串-&lbrack;快速乘法&plus;矩阵乘法&rsqb;

    Description 传送门 Solution 由于这里带了小数,直接计算显然会爆掉,我们要想办法去掉小数. 而由于原题给了暗示:b2<=d<=(b+1)2,我们猜测可以利用$(\fra ...

随机推荐

  1. avalon全选效果分析讲解

    全选功能就是 1.点击全选控制循环元素是否选中.(点击全选,下面的所有元素选中,再次点击 所有元素取消选中.) 2.点击循环元素控制全选.(如果当前元素是未选中状态则全选不选中,如果当前元素是选中状态 ...

  2. Linux下安装tomcat

    安装tomcat之前首先安装jdk,这个看前面的帖子. 下面说centeros6.5安装tomcat7的方法: 1.将apache-tomcat-7.0.29.tar.gz文件上传到/home/zha ...

  3. &lbrack;BZOJ1072&rsqb;&lbrack;SCOI2007&rsqb; 排列prem

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  4. JavaScript的prototype&lpar;原型&rpar;

    JavaScript的每一个对象都有prototype属性哦 对象方法.类方法.原型方法 1.对象方法:理解就很简单了,主要是如果类生成一个实例,那么该实例就能使用该方法2.类方法:不需要通过生成实例 ...

  5. 16&period;&lpar;转&rpar; Android之Support v4、v7、v13的区别和应用场景

    我们在项目中经常会碰到Android Support v4.v7和v13包兼容问题,所以有必要梳理下这些东西. google提供了Android Support Library package 系列的 ...

  6. easyui的combobox将得到的数据设定为下拉框默认值和复选框设定默认值

    通过easyui做了一个表,表里是从数据库拿到的数据. 现在双击某一行,通过点击行的id取到这一行的所有数据,现在需要修改这些得到的数据, 其中部分数据是<select>这个选择的, 问题 ...

  7. day02(编程语言,解释器,环境变量,执行方式,pycharm,pip,变量三大组成)

      上节课复习: 重点: 1,进制转换:二进制与十六进制 2,内存分布:栈区 与 堆区 10101001110111 => 2a77 abf1 => 1010101111110001 计算 ...

  8. idea中war和war exploded的区别及修改jsp必须重新启动tomcat才能生效的问题

    刚开始使用idea,发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能有这么不方便的功能存在. 需要在Tomca ...

  9. COM,SOM, QT&comma; GObject&comma; ObjectiveC

    COM,SOM, QT, GObject, ObjectiveC https://en.wikipedia.org/wiki/IBM_System_Object_Model#Comparison_of ...

  10. Android 8 声音调整过程

    记录Android 8声音调整过程. frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.j ...