题目背景

在长沙城新建的环城公路上一共有8个公交站,分别为A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站A到公交站D,你就至少需要换3次车。

Tiger的方向感极其糟糕,我们知道从公交站A到公交E只需要换4次车就可以到达,可是tiger却总共换了n次车,注意tiger一旦到达公交站E,他不会愚蠢到再去换车。现在希望你计算一下tiger有多少种可能的乘车方案。

题目描述

输入输出格式

输入格式:

仅有一个正整数n(4<=n<=10000000),表示tiger从公交车站A到公交车站E共换了n次车。

输出格式:

仅有一个正整数,由于方案数很大,请输出方案数除以 1000后的余数。

输入输出样例

输入样例#1:

6
输出样例#1:

8

说明

8条路线分别是:

(A→B→C→D→C→D→E),(A→B→C→B→C→D→E),

(A→B→A→B→C→D→E),(A→H→A→B→C→D→E),

(A→H→G→F→G→F→E),(A→H→G→H→G→F→E),

(A→H→A→H→G→F→E),(A→B→A→H→G→F→E)。

题解:

看到数据范围n<=10000000。想到肯定要O(n)才能过。

O(n)算法复杂度+一个输入输出,肯定就是递推啦

可是递推公式??

暴力算前几个答案是

4  5  6  7  8  9  10  11  12  13  14

2  0  8  0  28    0  96  0  328  0  1120

发现当n为奇数时,ans=0;

开始想递推式

设f[i]=x*f[i-1]+y;           解出答案后代入后面是不成立的

设f[i]=x*f[i-1]+y*f[i-2]+z;

28=8x+2y+z;  96=28x+8y+z;    328=96x+28y+z;

解得 x=4;y=-2;z=0;带入后面也是成立的

于是,递推式就出来了,f[i]=4*f[i-1]-2*f[i-2];

一个非常坑的地方:由于答案%1000后f[i-2]有可能大于f[i-1]

所以极端情况下,f[i-2]=999,f[i-1]=0;所以如代码所示,还要+2000后再%1000

#include<iostream>
using namespace std;
int f[];
int main()
{
int n;cin>>n;
if(n&)cout<<;
else
{
f[]=;f[]=;
for(int i=;i<=n;i+=)f[i]=(*f[i-]-*f[i-]+)%;
cout<<f[n];
}
return ;
}

代码居然才写了15行。。。这是省选题啊

那如果加强这个数据,变为有T组数据,每组数据的n变为4<=n<=10^18怎么做呢

那我们可以用矩阵快速幂优化到O(Tlog(n))

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mod=;
struct data{
int d[][];
}a,b,c;
data mul(data a,data b)
{
memset(c.d,,sizeof(c.d));
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
{
c.d[i][j]=(c.d[i][j]+a.d[i][k]*b.d[k][j])%mod;
}
return c;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
long long n;scanf("%lld",&n);
if(n&)printf("0\n");
else
{
b.d[][]=;b.d[][]=;b.d[][]=-+mod;b.d[][]=;
a.d[][]=;a.d[][]=;a.d[][]=;a.d[][]=;
n=(n-)/;
while(n)
{
if(n&)a=mul(a,b);
b=mul(b,b);n>>=;
}
printf("%d\n",(a.d[][]*+a.d[][]*)%mod);
}
}
return ;
}

[HNOI2002] 公交车路线的更多相关文章

  1. 洛谷 P2233 [HNOI2002]公交车路线 解题报告

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  2. 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  3. P2233 [HNOI2002]公交车路线

    洛咕原题 dp->矩阵乘法 首先我们可以得出一个状态转移方程 f[i][j]=f[i-1][j-1]+f[i-1][j+1] 蓝后发现,我们可以把这转化为一个8*8的转移矩阵 然后跑一遍矩阵快速 ...

  4. 洛谷 2233 [HNOI2002]公交车路线

    题目戳这里 一句话题意 一个大小为8的环,求从1到5正好n步的方案数(途中不能经过5). Solution 巨说这个题目很水 应该是比较容易的DP,直接从把左边和右边的方案数加起来即可,但是有几个需要 ...

  5. 【HNOI2002】【矩阵快速幂】公交车路线

    仍然是学弟出的题目的原题@lher 学弟将题目改成了多组数据,n在ll范围内,所以我就只讲提高版的做法. 链接:https://www.luogu.org/problem/show?pid=2233 ...

  6. NOIpDairy

    Day 0 水水比赛 Day 1 写写Dp Part1:Dp基础练习 [HNOI2002]公交车路线 秒切,点数这么少,N这么大,目测O(N)+暴力更新 5min写完 P3842 [TJOI2007] ...

  7. X000101

    P3879 [TJOI2010]阅读理解 考虑用 Trie 解决 #include<stdio.h> #include<bitset> #include<string.h ...

  8. BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)

    第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...

  9. 【高德地图API】从零开始学高德JS API(五)路线规划——驾车|公交|步行

    原文:[高德地图API]从零开始学高德JS API(五)路线规划——驾车|公交|步行 先来看两个问题:路线规划与导航有什么区别?步行导航与驾车导航有什么区别? 回答: 1.路线规划,指的是为用户提供3 ...

随机推荐

  1. 裸机——DDR

    1.DDR介绍 DDR,是SDRAM的改进,是双通道的SDRAM, SDRAM是同步动态随机访问存储器. SDRAM与SRAM相对于,二者的特点是: SDRAM 需要初始化,使用时许访问,价格便宜. ...

  2. 笔记-python-lib-requests常用类/方法/属性

    笔记-python-lib-requests常用类/方法/属性 1.      requests模块常用类/方法/属性 在使用中发现对requests模块不够熟悉,写了几个案例后重新整理了一下文档,罗 ...

  3. Pandas库入门

    pandas库的series类型

  4. (B)springboot配置开发和测试环境并添加启动路径

    嗯,开发和测试环境要分离,这是一般共识(虽然我工作过的公司都没有这种分离),spring boot也可以按照配置文件的读取来做到这一点. 上图有三个application开头的配置文件,要达到能够读取 ...

  5. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

    键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键时,可以考虑使用键盘钩子,如大家常用qq的截图快捷键,那么在WPF里怎么去 ...

  6. python 之发送邮件服务[原著] 海瑞博客

    Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...

  7. 【Linux】wc :字数统计命令

    wc :(Word Count) 统计每个传入文件中行数.词数与字节数 $ wc py_this # 三个数字分别对应行数.词数和字节数 21 144 857 py_this $ wc py_this ...

  8. [ecmagent][redis学习][1初识redis] python操作redis

    #1 连接redis # 连接redis -- import redis -- 使用端口连接redis conn = redis.Redis(host=) -- 使用套接字连接 r = redis.R ...

  9. 创建虚拟机流程nova

    这篇博文借鉴于http://www.cnblogs.com/yjbjingcha/p/6977741.html,感谢博友提供. 本文试图具体地描写叙述openstack创建虚拟机的完整过程.从用户发起 ...

  10. 搭建springmvc项目404,没扫描到包

    搭建简单项目完成之后,曾经出现过一个问题 跳转报了404,控制台忘了没留啊... 反正意思就是说我配置有问题,导致没有扫描到注释的类 <context:component-scan base-p ...