草莓植物(plant)【高精度-->array高级!!!】
【题目描述】
在宁静的乡村花园中,园丁小明发现了一种神奇的草莓植物。这种植物通过匍匐茎繁殖新植株,繁殖能力非常强。小明观察到,一株新种植的草莓在第一个月会生出a株新植株,在第二个月会生出b株新植株,从第三个月开始,每个月都会生出c株新植株。更神奇的是,每株新出生的草莓植株也会遵循相同的繁殖模式,无限持续下去,而且植株永远不会死亡。
小明很好奇,如果他从一株刚种植的草莓开始,按照这种理想模式繁殖,那么在第N个月时,花园中总共会有多少株草莓植株?为了帮助小明规划花园的空间,你需要计算第N个月的总植株数量。
【输入格式】
输入只有一行,包含四个整数a, b, c, N(0<=a<=b<=c<=100,N<=3000),分别表示第一个月、第二个月和第三个月及以后每月生出的新植株数量,以及需要计算的月数N。
【输出格式】
输出一个整数,表示第N个月时草莓植株的总数量。
【输入样例】
0 1 1 11
【输出样例】
144
题目分析
这道题目要求计算一个递推数列的第n项,其中数列的每一项由前几项线性组合而成。具体来说,给定数列的初始条件和递推关系如下:
- 初始条件:
num1[0] = 1
,其余项初始化为0。 - 递推关系:
num1[i] = a * num1[i-1] + b * num2[i-1] + c1 * num3[i-1]
,同时更新num3[i]
和num2[i]
。
解题思路
复杂度分析
高精度处理:由于题目中可能涉及非常大的数,需要使用高精度算法来存储和计算。这里使用了数组来模拟大数,每位存储一个数字,从低位到高位排列。
递推计算:根据递推关系,逐步计算每一项的值。每次计算时需要处理高精度加法、乘法和赋值操作。
结果输出:最终结果是前几项的和,需要将所有相关项相加后输出。
关键操作说明
- 高精度加法:
jia
函数实现了两个高精度数的加法,处理进位并更新结果的位数。 - 高精度乘法:
chen
函数实现了高精度数与整数的乘法,处理进位并返回结果的位数。 - 时间复杂度:O(n * k),其中n是递推的项数,k是高精度数的位数。每次递推需要进行多次高精度加法和乘法操作。
- 空间复杂度:O(k),使用固定大小的数组存储高精度数。
- 数组清零:
fu
函数用于将数组所有元素置零。 - 数组赋值:
fuzhi
函数将一个数组的值赋给另一个数组,并更新目标数组的位数。 注意事项
- 高精度数的位数:需要根据题目要求调整数组大小,确保能够存储足够大的数。
- 初始条件:确保初始条件正确设置,否则递推结果可能错误。
- 进位处理:在高精度加法和乘法中,正确处理进位是确保结果正确的关键
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e4+105; #define ay array<int,N> int l1,l2,l3,l4,l5,l11; array<int,N>num1,c,num2,num3,ans; void jia(ay &a1,ay a2,int &l1,int &l2) {int l=max(l1,l2);for(int i=0;i<l;i++){a1[i]+=a2[i];if(a1[i]>=10){a1[i]-=10;a1[i+1]+=1;}}int j=l;if(a1[j]>0)l1=j+1;else l1=l; } void fu(ay &a1) {for(int i=0;i<=10000;i++)a1[i]=0; } ay chen(ay a1,int a,int l1) {for(int i=0;i<l1;i++)a1[i]*=a;if(a==0){fu(a1);l11=1;return a1;}int j=0;while(j<l1){a1[j+1]+=a1[j]/10;a1[j]%=10;j++;}while(a1[j]>0){a1[j+1]+=a1[j]/10;a1[j]%=10;j++;}l11=j;return a1; } void fuzhi(ay &a1,ay a2,int l2,int &l1) {for(int i=0;i<l2;i++)a1[i]=a2[i];for(int i=l2;i<=l1;i++)a1[i]=0;l1=l2; } signed main() {ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int a,b,c1,n;cin>>a>>b>>c1>>n;fu(num1);fu(num2);fu(num3);fu(c);fu(ans);num1[0]=1,l1=1;for(int i=1;i<=n;i++){jia(c,chen(num1,a,l1),l5,l11);jia(c,chen(num2,b,l2),l5,l11);jia(c,chen(num3,c1,l3),l5,l11);jia(num3,num2,l3,l2);fuzhi(num2,num1,l1,l2);fuzhi(num1,c,l5,l1);fuzhi(c,{0},1,l5);}jia(ans,num1,l4,l1);jia(ans,num2,l4,l2);jia(ans,num3,l4,l3);for(int i=l4-1;i>=0;i--)cout<<ans[i];return 0; }
- 数组清零: