【NOI2017模拟4.5】无限棋盘

探讨在无限棋盘游戏中,从随机位置出发,沿着选定方向行走K-1步,得到两个长度为K的字符串相同的概率。通过倍增算法解决大数问题,给出样例输入输出及数据约束。
摘要由CSDN通过智能技术生成

题目

Description

无聊的小A在一个无限大的棋盘上玩游戏,这个棋盘由一个M*N的模板不停重复生成。例如,当模板为:
honi
hsin
时,我们会生成如下棋盘:
…honihonihonihoni…
…hsinhsinhsinhsin…
…honihonihonihoni…
…hsinhsinhsinhsin…
其中,该棋盘在任意一个方向都可以无限延伸。
现在小A在棋盘上随机挑选一个位置,又随机挑选一个方向(八个方向之一),并从该位置开始,沿着挑选的方向走K-1步,沿路记下每一个经过的字母(包括起点),得到一个长度为K的字符串。他重复并独立地执行该操作两次,得到两个长度为K的字符串,他现在想知道,这两个字符串相同的概率是多大?

Input

第一行包含三个正整数M,N,K(1<=M,N<=500, 2<=K<=10^9)。
接下来M行每行N个小写字母,表示生成棋盘的模板。该模板至少包含两个不同的字母。

Output

以最简分数形式输出选出两个相同字符串的概率p/q。

Sample Input

输入1:
1 2 2
ab
输入2:
2 4 3
honi
hsin
输入3:
3 3 10
ban
ana
nab

Sample Output

输出1:
5/16
输出2:
19/512
输出3:
2/27

Data Constraint

62.5%的数据满足:M=N。

题解

首先题目要求的其实就是从每个位置开始,往8个方向拓展到长度k,每种字符串有多少个相同的,但是注意到k很大,所以我们可以用类似倍增的方法来做
然后。。。好像没了QAQ

贴代码

const ma=30;
      ha=37;
      ha1=107;
      md=1000007;
var
    f,g,v:array[0..500,0..500,0..31]of int64;
    s:array[0..505,0..505]of longint;
    h:array[0..1000008,1..3]of longint;
    go:array[1..8,1..2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值