好像还没有人发这题的题解,那我就捷足先登了,我用的不是矩阵

这题是2539的升级版,qwq

由F(n)=F(n-1)+F(n-2),
且F(n-1)=F(n-2)+F(n-3),
且F(n-2)=F(n-3)+F(n-4),

………

且F(3)=F(2)+F(1),以上式子叠加,化简得到F(n)前n项和Sn=F(n+2)-F(1),即为2539答案;
对于这题,T(n)=F(1)+2×F(2)+3×F(3)+…+n×F(n)
由阿贝尔变换易得:令An=(1到n)∑F(n),则T(n)=An×n-(1到n-1)∑Ai×1;
再化简得Tn=n*F(n+2)-F(n+3)+F(1)+F(2);

下面是代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. ll n,p;
  5. map<ll,ll> mp;
  6. ll calc(ll n){
  7. if (mp[n]) {
  8. return mp[n];
  9. }
  10. ll tmp=n;
  11. n=n>>1;
  12. if (tmp%2) return mp[tmp]=calc(n)*calc(n)%p+calc(n+1)*calc(n+1)%p;
  13. else return mp[tmp]=(2*calc(n-1)+calc(n))*calc(n)%p;
  14. }//这是别人的方法,复杂度也是logn我借用了一下
  15. int main(){
  16. cin>>n>>p;
  17. mp[1]=mp[2]=1;
  18. long long ans_1=calc(n+2)%p;//
  19. long long ans_2=calc(n+3)%p;//
  20. long long ans=n*ans_1-ans_2+2;//推导结果的体现
  21. ans%=p;
  22. ans+=ans<0?p:0;//防止得到负数
  23. cout<<ans<<endl;
  24. return 0;
  25. }

想学快速求第n项方法的,传送门
新手写题解,欢迎吐槽

点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论