问题描述
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房𝑀M开始爬到蜂房𝑁N,1≤𝑀<𝑁≤1001≤M<N≤100,有多少种爬行路线?
输入
输入 𝑀M,𝑁N 的值。 (1≤𝑀<𝑁≤1001≤M<N≤100)
输出
爬行有多少种路线。
样例
输入
1 14
输出
377
输入
1 100
输出
354224848179261915075
解决这一道题时我用的是一个高精度模板Wint:vector<int > vec;来做的,虽然有点不太像递推,但还是用了亿点点……
不过值得注意的是中间的operator和iterator迭代器对vector向量的影响。
介于我这么努力地写题解,点赞+收藏+关注,拜托……
代码如下
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct Wint:vector<int>//高精度模板
{
Wint(int n=0)
{
push_back(n);
check();
}
Wint& check()
{
for(int i=1; i<size(); ++i)
{
(*this)[i]+=(*this)[i-1]/10;
(*this)[i-1]%=10;
}
while(back()>=10)
{
push_back(back()/10);
(*this)[size()-2]%=10;
}
return *this;
}
};
istream& operator>>(istream &is,Wint &n)
{
string s;
is>>s;
n.clear();
for(int i=s.size()-1; i>=0; --i)n.push_back(s[i]-'0');
return is;
}
ostream& operator<<(ostream &os,const Wint &n)
{
if(n.empty())os<<0;
for(int i=n.size()-1; i>=0; --i)os<<n[i];
return os;
}//输入输出
Wint& operator+=(Wint &a,const Wint &b)
{
if(a.size()<b.size())a.resize(b.size());
for(int i=0; i!=b.size(); ++i)a[i]+=b[i];
return a.check();
}
Wint operator+(Wint a,const Wint &b)
{
return a+=b;
}//写A+B Problem...
/*以上皆是用重载运算符实现的高精*/
Wint f[1005]={0,1,1};//进行赋初值,f[1]=f[2]=1
int main(){
int m,n;
cin>>m>>n;
for(int i=3;i<=n-m+1;++i) f[i]=f[i-1]+f[i-2];//进行递推
cout<<f[n-m+1];//输出答案
return 0;
}