CCF CSP 1246 Python 96分
1.暴力法
根据变换规则,按时间依次计算出下一个状态的字符串。
def counts(S,i):
# :param S: 要查找的字符串
# :param i: 输入的字符串
# :return: 输入的字符串在S里面出现的次数
c=0
for j in range(len(S)- len(i)+1):
if S[j:j+len(i)]==i:
c+=1
return c
n=int(input())
s=input()
s0="16"
temp=""
if n==1:
s0="2"
n=3
if n==2:
s0="4"
n=3
for h in range(n-3):
for k in s0:
if int(k) == 4:
temp += "16"
elif int(k) == 6:
temp += "64"
else:
temp += str(2 ** (int(k)))
s0=temp
temp=""
print(counts(s0,s) % 998244353)
2.动态规划加矩阵快速幂优化。
首先注意到测试样例中前14个字符串S的长度都为1或2,所以这个题可以这样做。
思路以及代码参考自here,只不过我是用python写的,代码如下:
def matride(m1,m2): #矩阵相乘
a=[[0]*len(m1[0]) for _ in range(len(m1))]
for i in range(len(m1)):
for j in range(len(m2[0])):
for k in range(len(m1[0])):
a[i][j]+=m1[i][k]*m2[k][j]
a[i][j]%=998244353 #对相乘得到的矩阵的每一个元素都取模运算,可以是数字变小,提高运行速度
return a
def quickPow(m,n): #矩阵的快速幂算法
E=[[0]* len(m) for _ in range(len(m))]
for i in range(len(E)):
E[i][i]=1
tmp=m
res=E
while n:
if n & 1:
res=matride(tmp,res)
tmp=matride(tmp,tmp)
n=n>>1
return res
n=int(input())
S=input()
mat= [[0,1,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[1,0,0,1,1,0,0,0,0,0,0,0,0,0],
[0,0,1,1,0,0,0,0,0,0,0,0,1,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0]] #由动态转移方程推得的动态转移矩阵
m0=[1,0,0,0,0,0,0,0,0,0,0,0,0,0]
mp={"1":0,"2":1,"4":2,"6":3,"16":4,"26":5,"41":6,"42":7,"44":8,"46":9,"61":10,"62":11,"64":12,"66":13}
mt=quickPow(mat,n)
mr=mt[0]
print(mr[mp[S]]%998244353)