P5110-块速递推【特征方程,分块】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P5110


1|1题目大意

数列a满足

an=233an1+666an2,a0=0,a1=1

T组询问给出nan

1T5×107nunsigned long long范围内


1|2解题思路

上面那个递推式的特征方程就是x2233x666,直接带式子解出来x0=233+569532,x1=233569532

然后设an=c0x0n+c1x1n,那么带入a0a1就有

{c0+c1=0c0233+569532+c1233569532=1

解出来有c0=156953,c1=156953

这样我们就可以O(Tlogn)求答案了,但是还是不够。

先根据欧拉定理让n模上φ(P)缩小范围

然后分块处理快速幂,处理出xixiP(i[0,P]),这个是O(P)的,然后每次把n分为整块的成上末尾的就好了。

时间复杂度O(P+T)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; const ll P=1e9+7,Phi=P-1; const ll sq=188305837,T=32000; ll Q,n,p0[T+1],p1[T+1],P0[T+1],P1[T+1],ans; ll pw0(ll x){return P0[x/T]*p0[x%T]%P;} ll pw1(ll x){return P1[x/T]*p1[x%T]%P;} namespace Mker { unsigned long long SA,SB,SC; void init(){scanf("%llu%llu%llu",&SA,&SB,&SC);} unsigned long long rand() { SA^=SA<<32,SA^=SA>>13,SA^=SA<<1; unsigned long long t=SA; SA=SB,SB=SC,SC^=t^SA;return SC%Phi; } } signed main() { ll inv2=(P+1)/2; ll x0=(233+sq)*inv2%P,x1=(P+233-sq)*inv2%P; p0[0]=p1[0]=P0[0]=P1[0]=1; for(ll i=1;i<=T;i++) p0[i]=p0[i-1]*x0%P,p1[i]=p1[i-1]*x1%P; for(ll i=1;i<=T;i++) P0[i]=P0[i-1]*p0[T]%P,P1[i]=P1[i-1]*p1[T]%P; ll inv=233230706,c0=inv,c1=P-inv; scanf("%lld",&Q);Mker::init(); while(Q--){ n=Mker::rand(); // scanf("%lld",&n);ans=0; ans^=(c0*pw0(n)+c1*pw1(n))%P; // printf("%lld\n",ans); } printf("%lld\n",ans); }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14440343.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(55)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示