#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 的取值范围:0≤s<m0\leq s<m)

输入格式

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

输出格式

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

7 3 10 10 10
0000000000
7

数据范围

  • 对于 50%50\% 的数据:m≤104m\leq 10^4,n≤104n\leq 10^4
  • 对于 100%100\% 的数据:1≤n≤1051\leq n\leq 10^5,1≤m≤1061\leq m\leq 10^6 0≤a<m0\leq a< m,0≤c<m0\leq c< m,1≤k≤m1\leq k\leq m