package main import . "fmt" func main() { var t int Scan(&t) for ; t > 0; t-- { var d,a,b int Scan(&d,&a,&b) ans := solve(d,a,b) Println(ans) } } func solve(d, a, b int) int { s := nStar(d,a) x := b-a y := x/(d-1) z := x%(d-1) ans := s + y*d*(d-1)/2 if s+z >= d { t := s+z-(d-1) ans += t*(t+1)/2 z -= t } ans += z*s+z*(z+1)/2 return ans } /* 考察 N*は 0 以上 d-1 以下の値になると思われる f(N)は桁和なので f(N+1) = f(N) + 1 となるかもしれない これは少し怪しい 桁の繰り上がりが考慮されていない それに f(N+d) = f(N) + 1 かもしれない(桁の繰り上がりが考慮されてない) f(N+d^2) = f(N) + 1 かもしれない(桁の繰り上がりが考慮されてない) 桁の繰り上がりが発生する場合 f(N+1) < f(N) f(N+d) < f(N) f(N+d^2) < f(N) もありうる 脳内でいろいろ考えてたが おそらくN*は1~d-1で循環してそう */ func init() { check() } func nStar(d, n int) int { for n >= d { t := 0 for n > 0 { t += n % d n /= d } n = t } return n } func check() { for d := 2; d <= 30; d++ { p := 0 for n := 1; n < 1000; n++ { p++ if p >= d { p = 1 } x := nStar(d, n) if x != p { println("d=",d) println("n=",n) println("p=",p) println("x=",x) panic("wrong") } } } for d := 2; d <= 15; d++ { for a := 1; a < 100; a++ { for b := a; b < 100; b++ { ans := solve(d, a, b) expect := 0 for k := a; k <= b; k++ { expect += nStar(d, k) } if ans != expect { println("d=",d) println("a=",a) println("b=",b) println("ans=",ans) println("expect=",expect) panic("wrong") } } } } println("OK") }