zoukankan      html  css  js  c++  java
  • 斐波拉契高精度(洛谷1255)

    分析:第n次的台阶数为dp[n],则dp[n]=dp[n-1]+dp[n-2];

      1 //
      2 //  main.cpp
      3 //  1601
      4 //
      5 //  Created by wanghan on 16/10/12.
      6 //  Copyright © 2016年 wanghan. All rights reserved.
      7 //
      8 
      9 #include<cstdio>
     10 #include<cstring>
     11 #include<vector>
     12 #include<iostream>
     13 #include<set>
     14 #include<map>
     15 #include<cassert>
     16 using namespace std;
     17 
     18 using namespace std;
     19 
     20 struct BigInteger {
     21     typedef unsigned long long LL;
     22     
     23     static const int BASE = 100000000;
     24     static const int WIDTH = 8;
     25     vector<int> s;
     26     
     27     BigInteger& clean(){while(!s.back()&&s.size()>1)s.pop_back(); return *this;}
     28     BigInteger(LL num = 0) {*this = num;}
     29     BigInteger(string s) {*this = s;}
     30     BigInteger& operator = (long long num) {
     31         s.clear();
     32         do {
     33             s.push_back(num % BASE);
     34             num /= BASE;
     35         } while (num > 0);
     36         return *this;
     37     }
     38     BigInteger& operator = (const string& str) {
     39         s.clear();
     40         int x, len = (str.length() - 1) / WIDTH + 1;
     41         for (int i = 0; i < len; i++) {
     42             int end = str.length() - i*WIDTH;
     43             int start = max(0, end - WIDTH);
     44             sscanf(str.substr(start,end-start).c_str(), "%d", &x);
     45             s.push_back(x);
     46         }
     47         return (*this).clean();
     48     }
     49     
     50     BigInteger operator + (const BigInteger& b) const {
     51         BigInteger c; c.s.clear();
     52         for (int i = 0, g = 0; ; i++) {
     53             if (g == 0 && i >= s.size() && i >= b.s.size()) break;
     54             int x = g;
     55             if (i < s.size()) x += s[i];
     56             if (i < b.s.size()) x += b.s[i];
     57             c.s.push_back(x % BASE);
     58             g = x / BASE;
     59         }
     60         return c;
     61     }
     62     BigInteger operator - (const BigInteger& b) const {
     63         assert(b <= *this); // 减数不能大于被减数
     64         BigInteger c; c.s.clear();
     65         for (int i = 0, g = 0; ; i++) {
     66             if (g == 0 && i >= s.size() && i >= b.s.size()) break;
     67             int x = s[i] + g;
     68             if (i < b.s.size()) x -= b.s[i];
     69             if (x < 0) {g = -1; x += BASE;} else g = 0;
     70             c.s.push_back(x);
     71         }
     72         return c.clean();
     73     }
     74     BigInteger operator * (const BigInteger& b) const {
     75         int i, j; LL g;
     76         vector<LL> v(s.size()+b.s.size(), 0);
     77         BigInteger c; c.s.clear();
     78         for(i=0;i<s.size();i++) for(j=0;j<b.s.size();j++) v[i+j]+=LL(s[i])*b.s[j];
     79         for (i = 0, g = 0; ; i++) {
     80             if (g ==0 && i >= v.size()) break;
     81             LL x = v[i] + g;
     82             c.s.push_back(x % BASE);
     83             g = x / BASE;
     84         }
     85         return c.clean();
     86     }
     87     BigInteger operator / (const BigInteger& b) const {
     88         assert(b > 0);  // 除数必须大于0
     89         BigInteger c = *this;       // 商:主要是让c.s和(*this).s的vector一样大
     90         BigInteger m;               // 余数:初始化为0
     91         for (int i = s.size()-1; i >= 0; i--) {
     92             m = m*BASE + s[i];
     93             c.s[i] = bsearch(b, m);
     94             m -= b*c.s[i];
     95         }
     96         return c.clean();
     97     }
     98     BigInteger operator % (const BigInteger& b) const { //方法与除法相同
     99         BigInteger c = *this;
    100         BigInteger m;
    101         for (int i = s.size()-1; i >= 0; i--) {
    102             m = m*BASE + s[i];
    103             c.s[i] = bsearch(b, m);
    104             m -= b*c.s[i];
    105         }
    106         return m;
    107     }
    108     // 二分法找出满足bx<=m的最大的x
    109     int bsearch(const BigInteger& b, const BigInteger& m) const{
    110         int L = 0, R = BASE-1, x;
    111         while (1) {
    112             x = (L+R)>>1;
    113             if (b*x<=m) {if (b*(x+1)>m) return x; else L = x;}
    114             else R = x;
    115         }
    116     }
    117     BigInteger& operator += (const BigInteger& b) {*this = *this + b; return *this;}
    118     BigInteger& operator -= (const BigInteger& b) {*this = *this - b; return *this;}
    119     BigInteger& operator *= (const BigInteger& b) {*this = *this * b; return *this;}
    120     BigInteger& operator /= (const BigInteger& b) {*this = *this / b; return *this;}
    121     BigInteger& operator %= (const BigInteger& b) {*this = *this % b; return *this;}
    122     
    123     bool operator < (const BigInteger& b) const {
    124         if (s.size() != b.s.size()) return s.size() < b.s.size();
    125         for (int i = s.size()-1; i >= 0; i--)
    126             if (s[i] != b.s[i]) return s[i] < b.s[i];
    127         return false;
    128     }
    129     bool operator >(const BigInteger& b) const{return b < *this;}
    130     bool operator<=(const BigInteger& b) const{return !(b < *this);}
    131     bool operator>=(const BigInteger& b) const{return !(*this < b);}
    132     bool operator!=(const BigInteger& b) const{return b < *this || *this < b;}
    133     bool operator==(const BigInteger& b) const{return !(b < *this) && !(b > *this);}
    134 };
    135 
    136 ostream& operator << (ostream& out, const BigInteger& x) {
    137     out << x.s.back();
    138     for (int i = x.s.size()-2; i >= 0; i--) {
    139         char buf[20];
    140         sprintf(buf, "%08d", x.s[i]);
    141         for (int j = 0; j < strlen(buf); j++) out << buf[j];
    142     }
    143     return out;
    144 }
    145 
    146 istream& operator >> (istream& in, BigInteger& x) {
    147     string s;
    148     if (!(in >> s)) return in;
    149     x = s;
    150     return in;
    151 }
    152 set<BigInteger> s;
    153 map<BigInteger, int> m;
    154 
    155 int main() {
    156     BigInteger dp[5050];
    157     int n;
    158     while(cin>>n)
    159     {
    160         for(int i=0;i<5050;++i)
    161             dp[i]=BigInteger(0);
    162         dp[1]=BigInteger(1);
    163         dp[2]=BigInteger(2);
    164         if(n<=2){
    165             cout<<dp[n]<<endl;
    166             continue;
    167         }
    168         for(int i=3;i<=n;i++)
    169             dp[i]=dp[i-1]+dp[i-2];
    170         cout<<dp[n]<<endl;
    171     }
    172     return 0;
    173 }
    View Code
  • 相关阅读:
    C# 获取当前时间戳和将时间戳转为时间Datetime类型的方法
    Dynamics CRM 365 窗体的Lookup字段通过JS按照某个字段过滤数据
    Dynamic CRM 365 启用用户systemuser、修改用户systemuser的时候报错:The selected object could not be found. Verify that the object exists in both the database and Active Directory.
    Dynamics 365 V9.0版本后引入多选项集,SQL查询条件如何写
    Dynamics 365 V9.0版本后引入多选项集,SQL查询时,如何显示选中的选项名称
    SQLite实现Top功能
    RecyclerView滑动到指定位置
    使用Intent传递对象(两种)
    Android获取当前系统日期和时间
    jxl自动设置列宽
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5954931.html
Copyright © 2011-2022 走看看