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)
- }
- }
|