CCF CSP 1246 Python 96分

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值