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;
}
posted @ 2021-05-05 19:01  Biadocy  阅读(241)  评论(0编辑  收藏  举报