結果
| 問題 | No.3505 Sum of Prod of Root |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-04-19 15:37:51 |
| 言語 | Go (1.26.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,237 bytes |
| 記録 | |
| コンパイル時間 | 13,117 ms |
| コンパイル使用メモリ | 278,540 KB |
| 実行使用メモリ | 50,012 KB |
| 最終ジャッジ日時 | 2026-04-19 15:38:10 |
| 合計ジャッジ時間 | 16,574 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 9 WA * 4 |
ソースコード
package main
import . "fmt"
import . "sort"
import . "math"
const M = 998244353
// func max(a,b int) int { if a>b { return a; } else { return b; } }; func min(a,b int) int { if a<b { return a; } else { return b; } }
func main() {
var n int
Scan(&n)
if n > 1e15 {
Println(-1)
return
}
ans := solve(n)
// ans := calc2(n)
Println(ans)
}
func solve(n int) int {
ps := []*P{}
for i := 2; i <= 1e6; i++ {
for k,v := 3,i*i*i; v <= 1e18; k,v =k+1,v*i {
ps=append(ps,&P{v,i,k})
if int(1e18+v-1)/v < i {
break
}
}
}
Slice(ps, func(i, j int) bool {
return ps[i].value < ps[j].value
})
ms := make([]int, 60)
for i := range ms {
ms[i] = 1
}
ans := 0
next := 1
for next <= n && len(ps) > 0 {
last := ps[0]
ps = ps[1:]
mm := 1
for _, m := range ms[3:] {
mm = mm*m%M
}
lower := int(Sqrt(float64(next)))
upper := int(Sqrt(float64(last.value)))+1
for s := lower; s <= upper; s++ {
a := max(s*s, next)
b := min((s+1)*(s+1)-1, min(n,last.value-1))
if a > n || a > last.value-1 {
break
}
var t int
if b%2 == 0 {
t = (b/2)%M*((b+1)%M)%M
} else {
t = ((b+1)/2)%M*(b%M)%M
}
if a%2 == 0 {
t += M - (a/2)%M*((a-1)%M)%M
} else {
t += M - ((a-1)/2)%M*(a%M)%M
}
t %= M
// Printf("%#v\n", ms)
// Printf("n=%d,next=%d,a=%d,b=%d,s=%d,t=%d,mm=%d,lv=%d,ans=%d,tsm=%d\n",n,next,a,b,s,t,mm,last.value,ans,t*s%M*mm%M)
ans += t*s%M*mm%M
ans %= M
}
next = last.value
ms[last.power] = last.base
for len(ps) > 0 && last.value == ps[0].value {
p := ps[0]
ps = ps[1:]
ms[p.power] = p.base
}
}
return ans
}
type P struct { value, base, power int }
func calc1(i int) int {
r := i%M
// print("fs=",i)
for k := 2; ; k++ {
x := int(Pow(float64(i),1/float64(k)))
// print(",",x)
r = r*x%M
if x == 1 {
// println()
// println(Pow(float64(i),1/float64(k)))
break
}
}
// println("r=",r)
return r
}
func calc2(n int) int {
ans := 0
for i := 1; i <= n; i++ {
ans = (ans+calc1(i))%M
}
return ans
}
func init() {
// check()
}
func check() {
for n := 1; n <= 1000; n++ {
ok := calc2(n)
ans := solve(n)
println("n=",n,",ok=",ok,",ans=",ans)
if ok != ans {
panic("OMG!")
}
}
}
ID 21712