题目
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]