00011:火车站
-
总时间限制:
- 1000ms 内存限制:
- 1024kB
-
描述
-
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出是(即在到达第3 站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问从x站开出是车上的人数是多少?若无解输出“No answer.”(所有数据均在longint范围内)。
输入
- 一行,获得a,n,m,x 输出
- x站开出时车上的人数 样例输入
-
1 6 7 3
样例输出
-
2
提示
- 所有的数据均在Longint的范围内
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100010];//a的个数
int b[100010];//第二站上车的人的个数
int main()
{
int aa,n,m,x;
scanf("%d%d%d%d",&aa,&n,&m,&x);
if(x==1||x==2)
printf("%d\n",aa);
else if(x>2)
{
a[3]=1;
b[3]=0;
a[4]=0;
b[4]=1;
for(int i=5;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
b[i]=b[i-1]+b[i-2];
}
m=m-aa;
int sum1=0,sum2=0;
for(int i=3;i<n;i++)
{
sum1+=a[i];
sum2+=b[i];
}
if((m-sum1*aa)%sum2==0)
{
int mm=(m-sum1*aa)/sum2;
int sum=aa;
for(int i=3;i<=x;i++)
sum+=a[i]*aa+b[i]*mm;
printf("%d\n",sum);
}
else
{
printf("No answer.\n");
}
}
else
printf("No answer.\n");
return 0;
}