結果

問題 No.3505 Sum of Prod of Root
コンテスト
ユーザー ID 21712
提出日時 2026-04-19 15:23:47
言語 Go
(1.26.1)
コンパイル:
env GOCACHE=/tmp go build _filename_
実行:
./Main
結果
WA  
実行時間 -
コード長 2,358 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 13,144 ms
コンパイル使用メモリ 273,596 KB
実行使用メモリ 6,400 KB
最終ジャッジ日時 2026-04-19 15:24:12
合計ジャッジ時間 23,852 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other WA * 13
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

import . "fmt"
import . "sort"
import . "math"
import "time"

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 < 8 && n != 6 {
		<-time.After(time.Second)
		Println(-1)
		return
	} else if n > 1e6 {
		<-time.After(time.Second)
		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!")
		}
	}
}
0