0左邊必有1的二進制字符串數量

#include <iostream>
#include <vector>
using namespace std;
int process(int i, int N)
{
    if(i == N)
        return 1;
    if(i == N - 1)
        return 2;
    return process(i + 1, N) + process(i + 2, N);
}
int getNum1(int N)
{
    if(N < 1)
        return 0;
    return process(1, N);
}
int getNum2(int n)
{
    if(n < 1)
        return 0;
    if(n == 1)
        return 1;
    int pre = 1;
    int cur = 1;
    int temp = 0;
    for(int i = 2; i < n + 1; i++)
    {
        temp = cur;
        cur += pre;
        pre = temp;
    }
    return cur;
}
vector<vector<int> > muliMartix(vector<vector<int> > & m1, vector<vector<int> >& m2)
{
    vector<vector<int> > res(m1.size(), vector<int>(m2[0].size()));
    for(int i = 0; i < m1.size(); ++i)
        for(int j = 0; j < m2[0].size(); ++j)
        for(int k = 0; k < m2.size(); ++k)
         res[i][j] += m1[i][k] * m2[k][j];
    return res;
}
vector<vector<int> > matrixPower(vector<vector<int> >& m, int p)
{
    vector<vector<int> > res(m.size(), vector<int>(m[0].size()));
    for(int i = 0; i < res.size(); ++i)
        res[i][i] = 1;
    vector<vector<int> > tmp = m;
    for(; p != 0; p >>= 1)
    {
        if(p & 1)
            res = muliMartix(res, tmp);
        tmp = muliMartix(tmp, tmp);
    }
    return res;
}
int getNum3(int n)
{
    if(n < 1)
        return 0;
    if(n == 1)
        return 1;

    vector<vector<int> > m;
    vector<int> tmp;
    tmp.push_back(1);
    tmp.push_back(1);
    m.push_back(tmp);
    tmp[1] = 0;
    m.push_back(tmp);
    m = matrixPower(m, n - 2);
    return 2 * m[0][0] + m[1][0];
}
int main()
{
    cout << getNum1(8) << endl;
    cout << getNum2(8) << endl;
    cout << getNum3(8) << endl;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章