iscsi

SRM D1 512 : 512 SubFibonacci

Jul 28th, 2011
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. using namespace std;
  14. typedef long long LL;
  15. #define FOR(k,a,b) for(int k(a); k < (b); ++k)
  16. #define REP(k,a) for(int k=0; k < (a); ++k)
  17.  
  18.  
  19. class SubFibonacci {
  20.     vector<LL> mS;
  21.     vector<LL> fib;
  22.     vector<pair<LL,LL> > fibpairs;
  23.     map<LL,int> mMap;
  24.     int n,m;
  25.     int calc(int start,int end)
  26.     {
  27.         ++end;
  28.         int res=2;
  29.         FOR(i,start,end)
  30.         FOR(j,start,end)
  31.         if(i!=j)
  32.         {
  33.             FOR(k,0,2)
  34.             FOR(l,0,m)
  35.             // fibpairs[k].first*x+fibpairs[k].second*y = mS[i]
  36.             // fibpairs[l].first*x+fibpairs[l].second*y = mS[j]
  37.             if(k!=l)
  38.             {
  39.                 LL x,y;
  40.                 if(k==0)
  41.                 {
  42.                     x=mS[i];
  43.                     y=(mS[j]-fibpairs[l].first*mS[i]);
  44.                     if(y>0 && (y%fibpairs[l].second)==0)
  45.                         y/=fibpairs[l].second;
  46.                     else
  47.                         continue;
  48.                 }
  49.                 if(k==1)
  50.                 {
  51.                     y=mS[i];
  52.                     x=mS[j]-fibpairs[l].second*mS[i];
  53.                     if(x>0 && (x%fibpairs[l].first==0))
  54.                         x/=fibpairs[l].first;
  55.                     else
  56.                         continue;
  57.                 }
  58.                 LL ttmp,last=0;
  59.                 int tmpres=0;
  60.                 REP(ttt,fibpairs.size())
  61.                 {
  62.                     ttmp=fibpairs[ttt].first*x+fibpairs[ttt].second*y;
  63.                     if (mMap.count(ttmp) && mMap[ttmp]>=start && mMap[ttmp]<end && ttmp>last)
  64.                     {
  65.                         ++tmpres;
  66.                         last=ttmp;
  67.                     }
  68.                 }
  69.                 if (tmpres>res)
  70.                     res=tmpres;
  71.                
  72.             }
  73.         }
  74.         return res;
  75.     }
  76. public:
  77.     int maxElements(vector <int> S) {
  78.         sort(S.begin(),S.end());
  79.         n=S.size();
  80.         mS.resize(n);
  81.         REP(i,n)
  82.         {
  83.             mS[i]=S[i];
  84.             mMap[S[i]]=i;
  85.         }
  86.         const LL mMax=100000001;
  87.        
  88.         int res=min(4,n);
  89.         fib.resize(2,1);
  90.         while(fib.back()<mMax)
  91.             fib.push_back(fib[fib.size()-2]+fib[fib.size()-1]);
  92.         m=fib.size();
  93.         fibpairs.resize(m);
  94.         fibpairs[0]=make_pair(1,0);
  95.         fibpairs[1]=make_pair(0,1);
  96.         FOR(i,2,m)
  97.         {
  98.             fibpairs[i]=make_pair(fib[i-2],fib[i-1]);
  99.         }
  100.        
  101.         FOR(i,2,n-2)
  102.         {
  103.             int tmp=calc(0,i)+calc(i+1,n-1);
  104.             if (tmp>res)
  105.                 res=tmp;
  106.         }
  107.         return res;
  108.     }
  109.  
  110. };
Advertisement
Add Comment
Please, Sign In to add comment