找规律 递推

来源:互联网 发布:11选5的99算法 编辑:程序博客网 时间:2024/05/02 21:39

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;}

0 0