【Henu ACM Round #13 F】Fibonacci-ish
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
枚举序列的头两个数字是什么
O(N^2)
然后头两个数字确定之后。
f[3],f[4]..就确定了
只需查看f[3],f[4]..是不是存在就好了。
但是这样复杂度看起来是O(N^3)的了。
其实不然,a[n] = a[n-1]+a[n-2]这个递推的增长速度是接近2^n的增长速度的。
(所以到达10^9之后直接break就好了
所以实际上不会真的达到递推1000的规模
差不多只有O(N^2*100)的样子。
这是可以接受的了。
->但是有一种情况要特判,就是f[1] = f[2]=0的情况。这种情况直接统计1的个数即可。
程序中还加了一个优化。
因为前两项f1,f2确定之后f[i] = xf1+yf2
则我们提前算出来系数。
就能直接得到前两项是f1,f2的前提下fi的值了
根据这个可以做一下剪枝。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int a[N+10],n,b[N+10];
map<int,int> dic;
int x[N+10],y[N+10];
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
x[1] = 1;y[1] = 0;
x[2] = 0;y[2] = 1;
x[3] = y[3]= 1;
for (int i = 4;i <=N;i++){
x[i] = x[i-2]+x[i-1];
y[i] = y[i-2]+y[i-1];
}
cin >> n;
for (int i = 1;i <= n;i++) {
cin >> a[i];
dic[a[i]]++;
}
int ans = 2;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (i!=j){
if (a[i]==0 && a[j]==0){
int num = dic[0];
ans = max(ans,num);
continue;
}
dic[a[i]]--,dic[a[j]]--;
int num = 2;
b[1] = a[i],b[2] = a[j];
if (ans>2 && ans<=40){
long long temp = 1LL*x[ans]*a[i]+1LL*y[ans]*a[j];
if (abs(temp)>1e9|| dic[temp]==0){
dic[a[i]]++,dic[a[j]]++;
continue;
}
}
for (int k = 3;k<=n;k++){
b[k] = b[k-2]+b[k-1];
if (abs(b[k])>1e9) break;
if (dic[b[k]]>0){
dic[b[k]]--;
num++;
}else break;
}
ans =max(ans,num);
for (int k = 1;k <= num;k++) dic[b[k]]++;
}
cout << ans << endl;
return 0;
}
【Henu ACM Round #13 F】Fibonacci-ish的更多相关文章
- 【Henu ACM Round#16 F】Om Nom and Necklace
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#20 F】 Arthur and Brackets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...
- 【Henu ACM Round#19 F】Dispute
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...
- 【Henu ACM Round#14 F】 President and Roads
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...
- 【Henu ACM Round #13 E】Spy Syndrome 2
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对m个串建立一棵字典树. 然后对主串. 尝试从第一个位置开始.在字典树中尝试匹配 如果匹配到了位置i 就再从位置i+1开始尝试匹配 ...
- 【Henu ACM Round #13 D】A Trivial Problem
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 123...n中末尾0的个数 只会由素因子2和5的个数决定且等于 Min{cnt[2],cnt[5]} 且素因子2的个数一定会比5多 ...
随机推荐
- opencv矩阵运算(2)
简单介绍 本篇承接上一篇.继续opencv下矩阵计算的函数使用. 计算矩阵的逆 注意:矩阵A是可逆矩阵的充分必要条件是行列式detA不等于0. 详细代码 double x[3][3] = {{1, 2 ...
- delphi网络函数大全
{=========================================================================功 能: 网络函数库时 间: 2002/10/02版 ...
- Asp.Net 中使用 水晶报表(上)
Asp.Net中使用水晶报表(上) 在我们对VS.Net中的水晶报表(Crystal Reports)进行研究之前,我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心.一周以后,在阅 ...
- highGUI图形用户界面
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...
- [笔记-图论]Floyd
用于可带负权的多源最短路 时间复杂度O(n^3) 注意一定不要给Floyd一个带负环的图,不然就没有什么意义了(最短路不存在) 模板 // Floyd // to get minumum distan ...
- [BZOJ2821]作诗(分块)
题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题 把题看成这个了 从此又多了一道分块神题)把N个数 ...
- 洛谷P1006 传纸条 (棋盘dp)
好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...
- 【SRM 716 DIV 1 A】 ConstructLCS
Problem Statement A string S is a subsequence of a string T if we can obtain S from T by erasing som ...
- Eclipse反编译插件 Enhanced Class Decompiler
因为jar包中的源码都是经过反编译的,所以需要安装插件才能查看到源码,此处介绍的是 Enhanced Class Decompiler 插件. 打开Eclipse,Help --> Eclips ...
- Spring Cloud学习笔记【十】配置中心(消息驱动刷新配置)
上一篇中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用 Webhook 的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案 ...