解析:我们用up[i]表示在第 i 站上车的人数,add[i]表示在第 i 站的时候增加的人数,sum[i]表示从第 i 站出发时的人数,b[i]表示斐波那契数列的第 i 项,并假设第二站上车人数为k,则有:
由题意可得关系式:up[i]=up[i-1]+up[i-2](斐波那契数列的递推公式)
add[i]=up[i-2]
up[1]=1*a+0*k add[1]=1*a+0*k sum[1]=1*a+0*k
up[2]=0*a+1*k add[2]=0*a+0*k sum[2]=1*a+0*k
up[3]=1*a+1*k add[3]=1*a+0*k sum[3]=2*a+0*k
up[4]=1*a+2*k add[4]=0*a+1*k sum[4]=2*a+1*k
up[5]=2*a+3*k add[5]=1*a+1*k sum[5]=3*a+2*k
up[6]=3*a+5*k add[6]=1*a+2*k sum[6]=4*a+4*k
up[7]=5*a+8*k add[7]=2*a+3*k sum[7]=6*a+7*y
由上述推理可得:sum[i]=(b[0]+b[1]+b[2]+...+b[i-4]+2)*a+(b[0]+b[1]+....+b[i-3])*k
根据斐波那契数列的性质:b[0]+b[1]+...+b[i]=b[i+2]-1
sum[i]=(b[i-2]+1)*a+(b[i-1]-1)*k;
综上:m=(b[n-2]+1)*a+(b[n-1]-1)*k (根据此式,算出 k 的值)
sum[x]=(b[x-2]+1)*a+(b[x-1]-1)*k (得到答案)
观察代码,我们会发现,在n<=4时,求 k 的除法会出现问题(并且由上可知,在n<=4时,答案是与 k 无关的),所以我们将k的值初始化为 0 ;
当x==1时,我们输出答案部分也会出错,所以x==1的情况要特判。
代码:
#include <cstdio>
using namespace std;
int b[20]={0,1,1};
int main()
{
int a,n,m,x,i,k=0;
scanf("%d%d%d%d",&a,&n,&m,&x);
if(x==1){printf("%d",a);return 0;}
for(i=3;i<20;i++)b[i]=b[i-1]+b[i-2];
if(n>4)k=(m-(b[n-3]+1)*a)/(b[n-2]-1);
printf("%d",(b[x-1]-1)*k+(b[x-2]+1)*a);
return 0;
}