题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002

打表找规律,似乎是这样:https://blog.csdn.net/fzhvampire/article/details/46389897

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
struct N{
int a[];
N(){memset(a,,sizeof a);}
}f[],ans;
N add(N x,N y)
{
N ret;
ret.a[]=max(x.a[],y.a[]);
for(int i=;i<=ret.a[];i++)
ret.a[i]=x.a[i]+y.a[i];
for(int i=;i<=ret.a[];i++)
{
int t=ret.a[i]/; ret.a[i]%=;
ret.a[i+]+=t;
}
if(ret.a[ret.a[]+])ret.a[]++;
return ret;
}
N pw(N x)
{
N ret;
ret.a[]=*x.a[];
for(int i=;i<=x.a[];i++)
for(int j=;j<=x.a[];j++)
ret.a[i+j-]+=x.a[i]*x.a[j];
for(int i=;i<=ret.a[];i++)
{
int t=ret.a[i]/; ret.a[i]%=;
ret.a[i+]+=t;
}
if(ret.a[ret.a[]+])ret.a[]++;
while(ret.a[ret.a[]]==&&ret.a[])ret.a[]--;
return ret;
}
void sub(int k)
{
ans.a[]-=k; int i=;
while(ans.a[i]<)ans.a[i]+=,ans.a[++i]--;
while(ans.a[ans.a[]]==&&ans.a[])ans.a[]--;
}
void print()
{
for(int i=ans.a[];i;i--)printf("%d",ans.a[i]);
}
int main()
{
scanf("%d",&n);
f[].a[]=; f[].a[]=;
f[].a[]=; f[].a[]=;
for(int i=;i<=n;i++)
f[i]=add(f[i-],f[i-]);
ans=pw(f[n]);
if(n%==)sub();
print();
return ;
}

还有大家都在说的结论:http://vfleaking.blog.163.com/blog/static/17480763420119685112649/

也就是:f[i] = ( f[i-1]*3 - f[i-2] + 2 )

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
struct N{
int a[];
// N(){memset(a,0,sizeof a);}
}f[],ans;
N sub(N x,N y)
{
x.a[]+=;
int j=;
while(x.a[j]>=){x.a[j]%=;x.a[j+]++;j++;}
for(int i=;i<=x.a[];i++)
{
x.a[i]-=y.a[i];
if(x.a[i]<)x.a[i]+=,x.a[i+]--;
}
// for(int i=1;i<=x.a[0];i++)
// if(x.a[i]<0)x.a[i]+=10,x.a[i+1]--;
while(x.a[x.a[]]==&&x.a[])x.a[]--;
return x;
}
//N add(N x,int k)
//{
// x.a[1]+=k; int i=1;
// while(x.a[i]>=10)x.a[i+1]+=x.a[i]/10,x.a[i]%=10,i++;
// if(x.a[x.a[0]+1])x.a[0]++;
// return x;
//}
N mul(N x,int k)
{
for(int i=;i<=x.a[];i++)x.a[i]*=k;
for(int i=;i<=x.a[];i++)
{
x.a[i+]+=x.a[i]/; x.a[i]%=;
}
if(x.a[x.a[]+])x.a[]++;
return x;
}
void print()
{
for(int i=f[n].a[];i;i--)printf("%d",f[n].a[i]);
}
int main()
{
scanf("%d",&n);
f[].a[]=; f[].a[]=;
f[].a[]=; f[].a[]=;
for(int i=;i<=n;i++)
{
// f[i]=mul(f[i-1],3);
// f[i]=sub(f[i],f[i-2]);
// f[i]=add(f[i],2);
f[i]=sub(mul(f[i-],),f[i-]);
}
print();
return ;
}

果然考场上还是打表找规律比较靠谱...

然而为什么,我的代码跑得好慢...

最新文章

  1. 启动Tomcat内存溢出解决:java.lang.OutOfMemoryError: PermGen space
  2. 【leetcode】 Remove Duplicates from Sorted List
  3. Sprint.Net 笔记
  4. iOS - UIStoryboard
  5. linq里的select和selectmany操作
  6. LCA 笔记
  7. CSU1612Destroy Tunnels(强连通)
  8. linux C高手成长过程---书籍推荐
  9. boosting和bagging
  10. Javascript Design Patterns - Js Class
  11. WCF学习系列二_使用IIS发布WCF服务
  12. asp.net mvc5 设置Area下的为启动页
  13. spoj 104 Highways (最小生成树计数)
  14. 转每天一个linux命令(8):cp 命令
  15. 重温吕鑫MFC教学视频(一)
  16. bzoj 5297: [Cqoi2018]社交网络
  17. region server 中的OOM原因
  18. Python——Flask框架——程序的基本结构
  19. 我的Git
  20. 2019 CCPC wannfly winter camp Day 5

热门文章

  1. 搞懂分布式技术10:LVS实现负载均衡的原理与实践
  2. 第八天 1-7 实战:创建一个root无法删除的文件
  3. 奇怪的表达式求值 (java实现)
  4. Ansible 手册系列 一(介绍)
  5. asp.net连接MySQL数据库错误-Out of sync with server
  6. USB events thread - failed to set priority
  7. hystrix -hystrix常用配置介绍
  8. ide 下spingboot 实现热部署
  9. zhx&#39;code1
  10. linux下c语言源码编译