| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | 
							- package main
 
- import (
 
- 	"bufio"
 
- 	"fmt"
 
- 	"os"
 
- )
 
- // MOD ...
 
- const MOD = 2 * 3 * 5 * 7
 
- func countUgly(scanner *bufio.Scanner) []int {
 
- 	caseCnt := ReadInt(scanner)
 
- 	answer := make([]int, caseCnt)
 
- 	for cid := 0; cid < caseCnt; cid++ {
 
- 		s := ReadLine(scanner)
 
- 		dp := make([][]int, len(s)+1)
 
- 		for i := range dp {
 
- 			dp[i] = make([]int, MOD)
 
- 		} // dp[i][j] means the count of numbers which mod MOD equals j
 
- 		dp[0][0] = 1
 
- 		for i := 0; i < len(s); i++ {
 
- 			sgn := -1
 
- 			if i == 0 {
 
- 				sgn = 1
 
- 			}
 
- 			for ; sgn <= 1; sgn += 2 {
 
- 				num := 0
 
- 				for j := i; j < len(s); j++ {
 
- 					num = (num*10 + int(s[j]-'0')) % MOD
 
- 					for x := 0; x < MOD; x++ {
 
- 						dp[j+1][(x+sgn*num+MOD)%MOD] += dp[i][x]
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		for i := 0; i < MOD; i++ {
 
- 			if i%2 == 0 || i%3 == 0 || i%5 == 0 || i%7 == 0 {
 
- 				answer[cid] += dp[len(s)][i]
 
- 			}
 
- 		}
 
- 	}
 
- 	return answer
 
- }
 
- func main() {
 
- 	inputFiles := []string{"B-small-practice.in", "B-large-practice.in", "test.in"}
 
- 	outputFiles := []string{"result-small.out", "result-large.out", "test.out"}
 
- 	const (
 
- 		small = iota
 
- 		large
 
- 		test
 
- 	)
 
- 	fileType := test
 
- 	fin, _ := os.Open(inputFiles[fileType])
 
- 	defer fin.Close()
 
- 	scanner := bufio.NewScanner(fin)
 
- 	answer := countUgly(scanner)
 
- 	fout, _ := os.Create(outputFiles[fileType])
 
- 	defer fout.Close()
 
- 	for i, v := range answer {
 
- 		s := fmt.Sprintf("Case #%d: %d\n", i+1, v)
 
- 		fout.WriteString(s)
 
- 	}
 
- }
 
 
  |