当前位置: 首页 > news >正文

P2233 [HNOI2002]公交车路线

题目描述

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

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

输入格式

仅有一个正整数 n,表示 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)。

数据范围

4≤n≤10^7。

 first,通过dp或超强的找规律方法,得到递推式

f[i] = f[i] * 4 - f[i-1] * 2;

then,设矩阵 a b

                    c d

前五项 0 2 8 28 96

得到 2a+8b=8

2c+8d=28

8a+28b=28

8c+28d=96

解得矩阵为

0 1 

-2 4

then ,求其k>>=1项

欧克

#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define  endl '\n'
#define lowbit(x) ((x)&-(x))
const int mod=1e3;
typedef long long ll;
ll ans=0,n1,m1;
ll t=0,s1=0,s2=0,s3=0,s4=0,max1=0,max2=0,w,min1=100000000,sum=0,n,m,i,j,k,v,l,r;inline int read() {bool sym=0;int res=0;char ch=getchar();while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();return sym ? -res : res;
}
void print(int x) {if(!x)return;print(x/10);putchar(x%10+'0');
}
int isPrime(int n) {float n_sqrt;if(n==1) return 0;if(n==2 || n==3) return 1;if(n%6!=1 && n%6!=5) return 0;n_sqrt=floor(sqrt((float)n));for(int i=5; i<=n_sqrt; i+=6) {if(n%(i)==0 | n%(i+2)==0) return 0;}return 1;}
ll a[107]={0,0,2,8,28};
//矩阵快速幂
struct mm {ll m[107][108];
} as,ass;
mm operator *(const mm&a,const mm&b ) {mm c ;memset(c.m ,0,sizeof c.m );for(ll i=1; i<=n; i++) {for(ll j=1; j<=n; j++) {for(ll k=1; k<=n; k++) {c.m [i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;}}}return c;
}
mm qmm(mm a,ll k) {mm ans;memset(ans.m ,0,sizeof ans.m );for(ll i=1; i<=n; i++)ans.m [i][i]=1;while(k) {if(k&1)ans=ans*a;a=a*a;k>>=1;}return ans;}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>k;
k>>=1;
n=2;
as.m [1][1]=0;
as.m [1][2]=1;
as.m [2][1]=-2;
as.m [2][2]=4;ass=qmm(as,k);cout<<abs(ass.m [1][1]);return 0;
}//mio lover

http://www.lryc.cn/news/69523.html

相关文章:

  • java入门-W11(K168-K182)网络编程
  • 距离6月18日DAMA-CDGA/CDGP认证考试还有31天,报名从速
  • PO、VO、DAO、BO、DTO、POJO区分
  • MobPush Flutter平台插件
  • 机器学习面试题库:K-means
  • Linux:文本三剑客之awk
  • 如何借助Kafka持久化存储K8S事件数据?
  • 一种基于非均匀分簇和建立簇间路由的算法的无线传感器网络路由协议(Matlab代码实现)
  • usb摄像头驱动打印信息
  • 银行半结构化和无领导群面注意事项
  • 今天公司来了个拿 30K 出来的测试,算是见识到了基础的天花板
  • SSM整合(单元测试、结果封装、异常处理)
  • C++ list
  • 【JavaScript】ES6新特性(2)
  • CST-FSS/周期谐振单元的仿真
  • 重新理解RocketMQ Commit Log存储协议
  • ROS 开发环境搭建(虚拟机版本)(一)
  • vue3做项目是需要注意的事项
  • docker日志轮转
  • 论文阅读_音频压缩_Encodec
  • 第06章_多表查询
  • 自学黑客(网络安全)有哪些技巧——初学者篇
  • CMD与DOS脚本编程【第四章】
  • Liunx安装Docker
  • docker:容器的数据卷
  • 【TCP】对TCP三次握手的个人理解
  • squid的基本代理
  • 【从零开始写视觉SLAM】v0.1基于特征点的简单VO
  • CentOS-7 安装 MariaDB-10.8
  • Packet Tracer – 对 VLAN 实施进行故障排除 – 方案 1