火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。
从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。
现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。
试问x站开出时车上的人数是多少?
Input有多组测试数据。
每组测试数据仅包含一行,每行包括四个整数,a,n,m和x。
0<= a <= 10
3<= n <= 30
1 <= x < n
0 <= m <= 2^31-1
Output对于每组测试数据,输出一行,包括一个整数,即从x站开出时车上的人数。Sample Input5 7 32 4Sample Output13

【分析】:

1.枚举第二站上下车的人数,根据题目给出的递推关系判断是否正确。递推关系题目描述得很清晰,数据规模也完全没有问题。

记第i站车上人数为f[i],上车人数为up[i],下车人数为down[i]

第一站人数为a则f[1]=a,up[1]=a,down[1]=0;

枚举第二站上下车的人k(0<=k<=m)

up[2]=down[2]=k;f[2]=f[1]+up[2]-down[2]=a;

第i站(3<=i<n):

up[i]=up[i-1]+up[i-2];

down[i]=up[i-1];

f[i]=f[i-1]+up[i]-down[i]

=f[i-1]+up[i-2];

由此我们第i站车上的乘客和down并没有关系

所以我们只要递推up和f

如果f[n-1]=m的话就得到了答案

————————————————————————————————————————————————————————

注意由于题目没有给出数据范围,不要把整个f和up开出来,直接使用临时变量递推

实际数据范围只要开到100就行

(不加优化即可过这道题,不过还是讲讲优化)

优化1

由于f是单调递增的可以二分查找

优化2

递推可以试试矩阵快速幂

【代码】:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000
using namespace std;
long long up[],down[],s[];
int main()
{
long long a,n,m,x,flag,i,j;
while(cin>>a>>n>>m>>x)
{
memset(s,,sizeof(s));
up[]=a;
flag=;
down[]=;
s[]=a;
for(i=;i<=m;i++)
{
up[]=i;
down[]=i;
s[]=s[];
for(j=;j<n;j++)
{
up[j]=up[j-]+up[j-];
down[j]=up[j-];
s[j]=s[j-]+up[j-];
}
if(s[n-]==m)
{
flag=;
printf("%lld\n",s[x]);
break;
}
}
}
return ;
}

枚举+递推

#include <bits/stdc++.h>
using namespace std;
int a,n,m,x;
int u[],c[];
int main()
{
cin>>a>>n>>m>>x;
u[]=a;
c[]=a;
c[]=a;
for(int k=;k<=m;k++)
{
u[]=k;
for(int i=;i<n;i++)
{
u[i]=u[i-]+u[i-];
c[i]=c[i-]+u[i-];
}
if(c[n-]==m)
{
cout<<c[x];
return ;
}
}
}

化简版

//数论
/*
* 第几站 上车 下车 车上人数
* 1 a1 0 a1
* 2 a2 a2 a1
* 3 a1+a2 a2 a1+a1
* 4 a1+a2+a2 a1+a2 a1+a1+a2
* 5 a1+a2+a1+a2+a2 a1+a2+a2 a1+a1+a2+a1+a2
* . . . .
* . . . .
* . . . .
* 到最后一站的人数就是m ,全部下完
* 思路,只要统计出a1个数和a2的个数就能求出a2,其中a1已经给出,m的数量就是n-1车站的开车的人数
* a2=(m-a1*a1的个数)/a2的个数
*/

  

#include<cstdio>
#include<cstring>
using namespace std;
int A[];
int B[];
void f(){
A[]=,A[]=,A[]=;
A[]=,A[]=;
for(int i=;i<=;i++)
A[i]=A[i-]+A[i-]-;
}
void ff(){
B[]=,B[]=,B[]=;
B[]=,B[]=;
for(int i=;i<=;i++)
B[i]=B[i-]+B[i-]+;
}
int main()
{
int a,n,m,x;
f();
ff();
while(~scanf("%d%d%d%d",&a,&n,&m,&x)){
int b[];
memset(b,,sizeof(b));
b[]=a;
b[]=a;
b[]=*a;
int xx=(m-A[n-]*a)/B[n-];
for(int i=;i<=;i++)
b[i]=A[i]*a+B[i]*xx;
printf("%d\n",b[x]);
}
return ;
}

学长出品,必属精品

HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】的更多相关文章

  1. NOI / 2.1基本算法之枚举-8759:火车上的人数

    8759:火车上的人数​​​​​​ 总时间限制: 1000ms 内存限制: 65536kB 描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下 ...

  2. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

  3. Struts2+Uploadify文件上传使用详解

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例是php版本的,本文将详细介绍Uploadify在java中的使用,您也可以点击下面的链接进行演示或下 ...

  4. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  5. luogu2312 解方程 (数论,hash)

    luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...

  6. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  7. MATLAB学习笔记(七)——MATLAB解方程与函数极值

    (一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. ...

  8. codevs3732==洛谷 解方程P2312 解方程

    P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 已知多项式方程: a ...

  9. bzoj 3751: [NOIP2014]解方程 同余系枚举

    3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...

随机推荐

  1. hadoop 启动or运行mr错误

    hadoop 错误:Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode. ...

  2. CSS需要注意的问题1(转生活因拼搏而精彩的网易博客)

      1.检查HTML元素(如:<ul>.<div>).属性(如:class=”")是否有拼写错误.是否忘记结束标记(如:<br />) 因为Xhtml 语 ...

  3. ogre3D学习基础3 -- 粒子与表层脚本

    9.粒子脚本 粒子脚本允许你实例化地在你的脚本代码中定义粒子系统,而不必在源代码中进行设置,使得你做任何修改都能得到快速回应.脚本里定义的粒子系统被用作模板,并且多个实际的系统可以在运行时从这里被创建 ...

  4. 几种常见的Android自动化测试框架及其应用

    随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...

  5. python 学习分享-实战篇增删改查作业

    一大波函数来袭 作业要求: 1本次作业通过空格及逗号,将文件拆分成列表,在通过判断add.del.update.select等关键字,来判断用户执行的是哪种命令,根据不同的命令调用不同的函数去处理. ...

  6. Leetcode 564.寻找最近的回文数

    寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123" 输出 ...

  7. win 8系统下如何安装搭建python

    python的环境搭建除了python本身,还有Aptana和pip的安装.Aptana提供了更好的集成开发环境,pip主要用于安装第三方的包. 具体安装流程可参考以下两篇文章: InSky关于安装p ...

  8. Unity属性——AddComponentMenu

    字面理解:添加 组件选项菜单 分析:可能是添加一个脚本或者组件到一个物体上 验证: 新建一个脚本:AttributeTest 提示:添加一个组件菜单属性,允许你放一个脚本在Compoent菜单下,来代 ...

  9. 编译linux kernel及制作initrd ( by quqi99 )

    编译linux kernel及制作initrd ( by quqi99 ) 作者:张华  发表于:2013-01-27    ( http://blog.csdn.net/quqi99 ) 运行一个l ...

  10. [luoguP2596] [ZJOI2006]书架(splay)

    传送门 题目中的几个操作,直接splay搞一下即可: 把s旋转到根,左子树接到右子树 把s旋转到根,右子树接到左子树 交换s相邻的信息即可 把s旋转到根,左子树的大小即为答案 找第k大 没了 #inc ...