Loading [MathJax]/jax/output/HTML-CSS/jax.js

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

题意

求$\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) $

分析

发现这个并不好算,而如果是(bd2)n那么就好算了。于是又想到数列的特征方程得到的解an=c1xn1+c2xn2,于是我们搞搞。直接将c1=c2=1,则变成an=xn1+xn2,而我们知道x1x2是特征方程的两个解,和上面那个形式极为相似,于是我们继续假设。即x1=(b+d2),x2=(bd2)。则an+2=pan+1+qan中,p=x1+x2,q=x1x2,因此得到an+2=ban+1b2d4an

题解

根据上面这个递推式,我们容易算出其中两项,容易得到a1=b,a2=b2+d2。而发现通项求出来的是整数,因此我们用矩阵乘法求出an即可。最后再根据条件特判一下(bd2)n即可,即ans=an[b2dn]
注意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;
}
posted @   iwtwiioi  阅读(572)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2014-11-22 高精度模板2(带符号压位加减乘除开方封包)
2014-11-22 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
2014-11-22 【BZOJ】1500: [NOI2005]维修数列(splay+变态题)
点击右上角即可分享
微信分享提示