nickel2halide

String Transmission

Oct 21st, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.55 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3.  
  4. import sys
  5.  
  6.  
  7. MOD = 1000000007
  8.  
  9.  
  10. def divisors(n):
  11.     d = 1
  12.     while d * d <= n:
  13.         if n % d == 0:
  14.             yield d
  15.             if d * d != n:
  16.                 yield n / d
  17.         d += 1
  18.  
  19.  
  20. def solve(N, K, S):
  21.     factors = list(divisors(N))
  22.     factors.sort()
  23.  
  24.     cost = [[[0, 0] for __ in range(N + 1)] for __ in range(N + 1)]
  25.     for d in factors:
  26.         for r in range(d):
  27.             for k in range(N / d):
  28.                 if S[d * k + r] == '1':
  29.                     cost[d][r][0] += 1
  30.                 if S[d * k + r] == '0':
  31.                     cost[d][r][1] += 1
  32.  
  33.     dp = [0 for __ in range(N + 1)]
  34.     for d in factors:
  35.         subdp = [[0 for __ in range(K + 1)] for __ in range(d + 1)]
  36.         for k in range(K + 1):
  37.             subdp[0][k] = 1
  38.         for r in range(d):
  39.             for k in range(K + 1):
  40.                 if cost[d][r][0] <= k:
  41.                     subdp[r + 1][k] += subdp[r][k - cost[d][r][0]]
  42.                 if cost[d][r][1] <= k:
  43.                     subdp[r + 1][k] += subdp[r][k - cost[d][r][1]]
  44.                 subdp[r + 1][k] %= MOD
  45.  
  46.         dp[d] = subdp[d][K]
  47.         for dd in divisors(d):
  48.             if dd == d:
  49.                 continue  # only want proper divisors
  50.             dp[d] -= dp[dd]
  51.             dp[d] %= MOD
  52.  
  53.     return dp[N]
  54.  
  55.  
  56. def main():
  57.     T = int(next(sys.stdin))
  58.     for t in range(T):
  59.         N, K = map(int, next(sys.stdin).split())
  60.         S = next(sys.stdin)
  61.         print solve(N, K, S)
  62.  
  63.  
  64. if __name__ == "__main__":
  65.     main()
Advertisement
Add Comment
Please, Sign In to add comment