2014年蓝桥杯 —— 斐波那契

Anpedestrian 2017-03-18 04:48:00

研究了矩阵的快速幂,敲了一下,两个样例是过了,但是只给了第一个样例的分。
真的搞不懂什么个鬼。。。


代码仅供参考(不是AC代码):

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
#include <sstream>
#include <queue>
#include <stack>
#include <vector>
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define For(a,b) for(int i = a;i<b;i++)
#define ll long long
#define MAX_N 100010

using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
ll M;
mat mul(mat &A,mat &B){
mat C(A.size(),vec(B[0].size()));
for(int i = 0; i<A.size(); i++)
{
for(int k = 0; k<B.size(); k++)
{
for(int j = 0; j<B[0].size(); j++)
{
C[i][j] = (C[i][j] + A[i][k] * B[k][j]);
}
}
}
return C;
}

mat mul2(mat &A,mat &B){
mat C(A.size(),vec(B[0].size()));
for(int i = 0; i<A.size(); i++)
{
for(int k = 0; k<B.size(); k++)
{
for(int j = 0; j<B[0].size(); j++)
{
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
}
}
}
return C;
}

mat pow(mat A,ll p,int r){
mat B(A.size(),vec(A[0].size()));
for(int i = 0; i<A.size(); i++){
B[i][i] = 1;
}

while(p>0)
{
if(p & 1)
{
if(r)
B = mul2(B,A);
else B = mul(B,A);
}
if(r)
A = mul2(A,A);
else A = mul(A,A);
p >>= 1;
}
return B;
}

ll f(ll p,int r){
mat A(2,vec(2));
A[0][0] = 1,A[0][1] = 1;
A[1][0] = 1,A[1][1] = 0;
A = pow(A,p,r);

ll con = (ll)A[1][0];
return con;
}

int main()
{
ll n,m,p;
while(~scanf("%lld %lld %lld",&n,&m,&p))
{
M = f(m,0);
//printf("%lld\n",x[1000]);
ll ans = 0;
for(int i = 1; i<=n; i++)
{
ans += (f(i,1));
}
ans %= M;
ans %= p;
printf("%lld\n",ans);
}
return 0;
}

...全文
238 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
欧阳春晖 2017-03-21
  • 打赏
  • 举报
回复
楼主到底有什么疑问?
FancyMouse 2017-03-21
  • 打赏
  • 举报
回复
我们也不知道你写的这是什么鬼。大框架看上去像是对的,小细节不知所云的不止一处。
Anpedestrian 2017-03-21
  • 打赏
  • 举报
回复
引用 5楼欧阳春晖 的回复:
楼主到底有什么疑问?
矩阵的幂算法实现出来提交到评测系统还超时。搞不懂为什么
Anpedestrian 2017-03-21
  • 打赏
  • 举报
回复
引用 4楼FancyMouse 的回复:
我们也不知道你写的这是什么鬼。大框架看上去像是对的,小细节不知所云的不止一处。
用矩阵的快速幂实现的结果还会超时到底是为什么。
sichuanwww 2017-03-20
  • 打赏
  • 举报
回复
Anpedestrian 2017-03-20
  • 打赏
  • 举报
回复
引用 2楼赵4老师 的回复:
只保存最高分吧。我猜。
但这不是重点啊。
赵4老师 2017-03-20
  • 打赏
  • 举报
回复
只保存最高分吧。我猜。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧