P1011 [NOIP1998 提高组] 车站
不妨设第 \(2\) 站上车和下车的乘客数量均为 \(y\)。
站编号 | 上车人数 | 下车人数 | 开出时车上人数 |
---|---|---|---|
\(1\) | \(a\) | \(0\) | \(a\) |
\(2\) | \(y\) | \(y\) | \(a\) |
\(3\) | \(a+y\) | \(y\) | \(2a\) |
\(4\) | \(a+2y\) | \(a+y\) | \(2a+y\) |
\(5\) | \(2a+3y\) | \(a+2y\) | \(3a+2y\) |
\(6\) | \(3a+5y\) | \(2a+3y\) | \(4a+4y\) |
\(7\) | \(5a+8y\) | \(3a+5y\) | \(6a+7y\) |
但 \(y\) 是未知的,所以先推一遍算出关于 \(a\) 的常数和 \(y\) 的系数,解出 \(y\) 的值,然后再推到 \(x\) 站算出答案。
code:
#include<bits/stdc++.h>
using namespace std;
#define For(i,x,y)for(i=x;i<=(y);i++)
int main()
{
int i,a,n,m,x,u,v,p,q,b,c=1,d,t,y,s;
cin>>a>>n>>m>>x;
if(x<3)cout<<a,exit(0);
if(n==x)cout<<0,exit(0);
u=s=a;
v=b=t=0;
For(i,3,n-1)
{
d=b+c;
/*cout<<i<<' '<<b<<' '<<c<<' '<<d<<endl;*/
t+=d-c;
b=c;
c=d;
p=u+v;
q=v;
s+=p-q;
u=v;
v=p;
}
y=(m-s)/t;
/*cout<<y<<endl;*/
u=s=a;
v=y;
For(i,3,x)
{
p=u+v;
q=v;
/*cout<<i<<' '<<u<<' '<<v<<' '<<p<<endl;*/
s+=p-q;
u=v;
v=p;
}
cout<<s;
return 0;
}