main.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. )
  7. // MOD ...
  8. const MOD = 2 * 3 * 5 * 7
  9. func countUgly(scanner *bufio.Scanner) []int {
  10. caseCnt := ReadInt(scanner)
  11. answer := make([]int, caseCnt)
  12. for cid := 0; cid < caseCnt; cid++ {
  13. s := ReadLine(scanner)
  14. dp := make([][]int, len(s)+1)
  15. for i := range dp {
  16. dp[i] = make([]int, MOD)
  17. } // dp[i][j] means the count of numbers which mod MOD equals j
  18. dp[0][0] = 1
  19. for i := 0; i < len(s); i++ {
  20. sgn := -1
  21. if i == 0 {
  22. sgn = 1
  23. }
  24. for ; sgn <= 1; sgn += 2 {
  25. num := 0
  26. for j := i; j < len(s); j++ {
  27. num = (num*10 + int(s[j]-'0')) % MOD
  28. for x := 0; x < MOD; x++ {
  29. dp[j+1][(x+sgn*num+MOD)%MOD] += dp[i][x]
  30. }
  31. }
  32. }
  33. }
  34. for i := 0; i < MOD; i++ {
  35. if i%2 == 0 || i%3 == 0 || i%5 == 0 || i%7 == 0 {
  36. answer[cid] += dp[len(s)][i]
  37. }
  38. }
  39. }
  40. return answer
  41. }
  42. func main() {
  43. inputFiles := []string{"B-small-practice.in", "B-large-practice.in", "test.in"}
  44. outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
  45. const (
  46. small = iota
  47. large
  48. test
  49. )
  50. fileType := test
  51. fin, _ := os.Open(inputFiles[fileType])
  52. defer fin.Close()
  53. scanner := bufio.NewScanner(fin)
  54. answer := countUgly(scanner)
  55. fout, _ := os.Create(outputFiles[fileType])
  56. defer fout.Close()
  57. for i, v := range answer {
  58. s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
  59. fout.WriteString(s)
  60. }
  61. }