← Home
For problem statement at 1000-1999/1100-1199/1110-1119/1114/problemF.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1110-1119/1114/verifierF.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD = 1000000007

var primes = []int64{
	2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
	73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
	157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
	239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
}

func power(base, exp int64) int64 {
	res := int64(1)
	base %= MOD
	for exp > 0 {
		if exp%2 == 1 {
			res = (res * base) % MOD
		}
		base = (base * base) % MOD
		exp /= 2
	}
	return res
}

var (
	tree_prod []int64
	tree_mask []uint64
	lazy_prod []int64
	lazy_mask []uint64
	mask_of   []uint64
	inv_p     []int64
	a         []int
)

func build(node, l, r int) {
	lazy_prod[node] = 1
	if l == r {
		tree_prod[node] = int64(a[l])
		tree_mask[node] = mask_of[a[l]]
		return
	}
	mid := l + (r-l)/2
	build(2*node, l, mid)
	build(2*node+1, mid+1, r)
	tree_prod[node] = (tree_prod[2*node] * tree_prod[2*node+1]) % MOD
	tree_mask[node] = tree_mask[2*node] | tree_mask[2*node+1]
}

func push(node, l, r int) {
	if lazy_prod[node] != 1 || lazy_mask[node] != 0 {
		mid := l + (r-l)/2

		tree_prod[2*node] = (tree_prod[2*node] * power(lazy_prod[node], int64(mid-l+1))) % MOD
		tree_mask[2*node] |= lazy_mask[node]
		lazy_prod[2*node] = (lazy_prod[2*node] * lazy_prod[node]) % MOD
		lazy_mask[2*node] |= lazy_mask[node]

		tree_prod[2*node+1] = (tree_prod[2*node+1] * power(lazy_prod[node], int64(r-mid))) % MOD
		tree_mask[2*node+1] |= lazy_mask[node]
		lazy_prod[2*node+1] = (lazy_prod[2*node+1] * lazy_prod[node]) % MOD
		lazy_mask[2*node+1] |= lazy_mask[node]

		lazy_prod[node] = 1
		lazy_mask[node] = 0
	}
}

func update(node, l, r, ql, qr int, x int64) {
	if ql <= l && r <= qr {
		tree_prod[node] = (tree_prod[node] * power(x, int64(r-l+1))) % MOD
		tree_mask[node] |= mask_of[x]
		lazy_prod[node] = (lazy_prod[node] * x) % MOD
		lazy_mask[node] |= mask_of[x]
		return
	}
	push(node, l, r)
	mid := l + (r-l)/2
	if ql <= mid {
		update(2*node, l, mid, ql, qr, x)
	}
	if qr > mid {
		update(2*node+1, mid+1, r, ql, qr, x)
	}
	tree_prod[node] = (tree_prod[2*node] * tree_prod[2*node+1]) % MOD
	tree_mask[node] = tree_mask[2*node] | tree_mask[2*node+1]
}

func query(node, l, r, ql, qr int) (int64, uint64) {
	if ql <= l && r <= qr {
		return tree_prod[node], tree_mask[node]
	}
	push(node, l, r)
	mid := l + (r-l)/2
	var p int64 = 1
	var m uint64 = 0
	if ql <= mid {
		p1, m1 := query(2*node, l, mid, ql, qr)
		p = (p * p1) % MOD
		m |= m1
	}
	if qr > mid {
		p2, m2 := query(2*node+1, mid+1, r, ql, qr)
		p = (p * p2) % MOD
		m |= m2
	}
	return p, m
}

func readInt(r *bufio.Reader) int {
	res := 0
	started := false
	for {
		c, err := r.ReadByte()
		if err != nil {
			break
		}
		if c <= ' ' {
			if started {
				break
			}
			continue
		}
		res = res*10 + int(c-'0')
		started = true
	}
	return res
}

func readString(r *bufio.Reader) string {
	var b []byte
	for {
		c, err := r.ReadByte()
		if err != nil {
			break
		}
		if c <= ' ' {
			if len(b) > 0 {
				break
			}
			continue
		}
		b = append(b, c)
	}
	return string(b)
}

func main() {
	reader := bufio.NewReaderSize(os.Stdin, 1<<20)
	writer := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer writer.Flush()

	n := readInt(reader)
	q := readInt(reader)

	a = make([]int, n+1)
	for i := 1; i <= n; i++ {
		a[i] = readInt(reader)
	}

	mask_of = make([]uint64, 305)
	for i := 1; i <= 300; i++ {
		var m uint64 = 0
		for j, p := range primes {
			if i%int(p) == 0 {
				m |= (1 << j)
			}
		}
		mask_of[i] = m
	}

	inv_p = make([]int64, len(primes))
	for i, p := range primes {
		inv_p[i] = ((p - 1) * power(p, MOD-2)) % MOD
	}

	tree_prod = make([]int64, 4*n+1)
	tree_mask = make([]uint64, 4*n+1)
	lazy_prod = make([]int64, 4*n+1)
	lazy_mask = make([]uint64, 4*n+1)

	build(1, 1, n)

	for i := 0; i < q; i++ {
		op := readString(reader)
		if op[0] == 'M' {
			ql := readInt(reader)
			qr := readInt(reader)
			x := readInt(reader)
			update(1, 1, n, ql, qr, int64(x))
		} else if op[0] == 'T' {
			ql := readInt(reader)
			qr := readInt(reader)
			p, m := query(1, 1, n, ql, qr)
			ans := p
			for j := 0; j < 62; j++ {
				if (m & (1 << j)) != 0 {
					ans = (ans * inv_p[j]) % MOD
				}
			}
			fmt.Fprintln(writer, ans)
		}
	}
}