Topcoder SRM 566 PenguinEmperor 题解

PenguinEmperor题解与算法分析

问题描述

Percy想成为企鹅皇帝。首先,他必须进行一次远程旅行来证明他自己。
  企鹅王国中有一些城市。所有城市坐落在大山周围的圆圈。城市标号从0到numCities - 1,顺时针分布在大山周围。
  Percy住在0号城市,他将从那里开始旅程。第一天他会去一个挨着0城市的城市,第二天他去一个离他现在所处城市2个城市远的城市,以此类推,对于任意k,在第k天他去一个离他目前所处城市k个城市远的城市。每天Percy都可以选择顺时针或者逆时针走。
  在这里插入图片描述
 给了你numCities来代表企鹅王国的城市数,也给你一个daysPassed表示他出发到现在的天数。计算并输出满足过了daysPassed天之后他再回到0号城市的不同旅行方式。如果两种方式满足有k满足按这两种方式走过了k天Percy在不同的城市,那么视为两种不同方式。因为数量可能很大,请输出结果除以1 000 000 007的余数。

输入格式

两个数,numCities和daysPassed。

输出格式

一个数,表示方式数。

数据范围

2<=numCities<=350;
1<=dayPassed<=10^18;

题解

以下记天数为 nnn,城市数为 mmm

算法 1

计数问题,我们可以考虑动态规划。令 fi,jf_{i,j}fi,j 表示第 iii 天走到第 jjj 个城市的方案数,初始化有 f0,0=1f_{0,0}=1f0,0=1,转移有:
fi,j={ (i+j) mod m=((j−i) mod m+m) mod m,fi−1,(i+j) mod melse⁡,fi−1,(i+j) mod m+fi−1,((j−i) mod m+m) mod mf_{i,j}= \begin{cases} (i+j)\bmod m=((j-i)\bmod m+m)\bmod m,f_{i-1,(i+j)\bmod m}\\ \operatorname{else},f_{i-1,(i+j)\bmod m}+f_{i-1,((j-i)\bmod m+m)\bmod m} \end{cases} fi,j={ (i+j)modm=((ji)modm+m)modm,fi1,(i+j)modmelse,fi1,(i+j)modm+fi1,((ji)modm+m)modm
直接计算可以做到 O(nm)O(nm)O(nm),期望得分 0 分。

算法 2

此乃递推式,我们是不是可以矩阵加速?不难发现,对于每个不同的 iii 我们都需要构建矩阵 tit_iti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值