题解 | #1到n中1的出现次数#

1到n中1的出现次数

http://www.nowcoder.com/practice/38af9b5a06ea4448ae9b2a488b6a991f

include

include

using namespace std;
int mm = 1e9 + 7;

vector<vector<long long="">> matriMulti(vector<vector<long long="">> &m1,vector<vector<long long="">> &m2)
{</long></long></long>

int r=m1.size();
int c=m1[0].size();
vector<vector<long long>> res(r,vector<long long>(c,0));
for(int i=0;i<r;i++)
    for(int j=0;j<c;j++)
        for(int k=0;k<c;k++)
        {
             res[i][j]=(res[i][j]+(m1[i][k]*m2[k][j])%mm)%mm;
        }
return res;

}
void multi(vector<vector<long long="">> &res,vector<vector<long long="">> &m,long long n)
{</long></long>

res[0][0]=1;
res[0][1]=0;
res[0][2]=0;
res[1][0]=0;
res[1][1]=1;
res[1][2]=0;
res[2][0]=0;
res[2][1]=0;
res[2][2]=1;
vector<vector<long long>> mtemp=m;
while(n!=0)
{
    if(n&1==1)
        res=matriMulti(res,mtemp);
   mtemp=matriMulti(mtemp,mtemp);
    n=n>>1;
}

}

long long f3(long long n)
{
if(n<1)
return 0;
if(n==1)
return 1;
if(n==2)
return 2;
if(n==3)
return 3;

vector<vector<long long>> m(3,vector<long long>(3,0));
vector<vector<long long>> res(3,vector<long long>(3,0));
m[0][0]=1;
m[0][1]=1;
m[0][2]=0;
m[1][0]=0;
m[1][1]=0;
m[1][2]=1;
m[2][0]=1;
m[2][1]=0;
m[2][2]=0;
multi(res,m,n-3);
return (3*res[0][0]+2*res[1][0]+res[2][0])%mm;

}
int main()
{

long long n;
cin >> n;

int result = f3(n);

cout << result;

return 0;

}

全部评论

相关推荐

2 1 评论
分享
牛客网
牛客企业服务