#P412. 随机序列求逆

随机序列求逆

题目描述

对一个正整数 ss 反复执行以下过程 nn 次,会得到一个二进制字符串:

  s = [(a*s+c)/k] mod m
  if (s < [m/2]) 
    output 0
  else 
    output 1

其中 [x][x] 表示不超过 xx 的最大整数。

给定一个二进制字符串pp,请问一开始ss有多少种不同的取值,可以问让输出的字符串恰好等于pp? (规定 ss 的取值范围:0s<m0\leq s<m

输入格式

第一行:五个整数aacckkmmnn。 第二行:nn个字符,表示给定的二进制字符串 pp

输出格式

单个整数:表示满足条件的 ss 的初值的方案数。

7 3 10 10 10
0000000000
7

数据范围

  • 对于 50%50\% 的数据:m104m\leq 10^4n104n\leq 10^4
  • 对于 100%100\% 的数据:1n1051\leq n\leq 10^51m1061\leq m\leq 10^6 0a<m0\leq a< m0c<m0\leq c< m1km1\leq k\leq m