牛客F-解方程(狄利克雷卷积)
解方程
https://ac.nowcoder.com/acm/contest/7329/F
package main
import (
"bufio"
"fmt"
"os"
"sync"
)
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a == min(a, b) {
return b
}
return a
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}
var out chan string
var in *bufio.Scanner
var outWg *sync.WaitGroup
func GetNum(p string) int64 {
var ans int64 = 0
flag := true
i := 0
n := len(p)
if p[i] == '-' {
flag = false
i++
}
for ; i < n; i++ {
ans = (ans << 1) + (ans << 3) + int64(p[i]-'0')
}
if !flag {
ans = -ans
}
return ans
}
func ReadString() string {
in.Scan()
return in.Text()
}
func ReadStringSlice(n int) []string {
s := make([]string, n)
for i := 0; i < n; i++ {
s[i] = ReadString()
}
return s
}
func ReadInt() int {
intStr := ReadString()
return int(GetNum(intStr))
}
func ReadIntSlice(n int) []int {
arr := make([]int, n)
for i := 0; i < n; i++ {
arr[i] = ReadInt()
}
return arr
}
func ReadInt64() int64 {
int64Str := ReadString()
return GetNum(int64Str)
}
func ReadInt64Slice(n int) []int64 {
arr := make([]int64, n)
for i := 0; i < n; i++ {
arr[i] = ReadInt64()
}
return arr
}
func init() {
in = bufio.NewScanner(os.Stdin)
in.Buffer(make([]byte, 1<<10), int(2e+5))
in.Split(bufio.ScanWords)
out = make(chan string, 1<<4)
outWg = &sync.WaitGroup{}
outWg.Add(1)
writer := bufio.NewWriterSize(os.Stdout, int(2e+5))
go func(write *bufio.Writer) {
defer outWg.Done()
defer write.Flush()
for line := range out {
write.WriteString(line + "\n")
}
}(writer)
}
func ksm(A,B,C int)int{
var a,b,c int64 = int64(A),int64(B),int64(C)
if b < 0 {
b=-b
}
var ans int64 = 1
for;b>0;b>>=1{
if (b&1==1){
ans=ans*a%c
}
a=a*a%c
}
return int(ans)
}
func mul(a,b,c int)int{
return a*b%c
}
const (
N = 1e7+5
mod = 998244353
)
var n,p,q,cnt int
var f,Q,pri [N]int
var vis [N]bool
func work() {
n,p,q = ReadInt(),ReadInt(),ReadInt()
k := p-q
Q[1],f[1]=1,1
for i:=2;i<=n;i++{
if !vis[i]{
cnt++
pri[cnt]=i
Q[i]=ksm(i,q,mod)
a := ksm(i,k,mod)
if k < 0{
a = ksm(a,mod-2,mod)
}
a = (mod+1-a)%mod
f[i]=mul(Q[i],a,mod)
}
for j:=1;j<=cnt&&i*pri[j]<=n;j++{
Q[i*pri[j]]=mul(Q[i],Q[pri[j]],mod)
vis[i*pri[j]]=true
if i%pri[j] == 0{
f[i*pri[j]] = mul(f[i],Q[pri[j]],mod)
break
}
f[i*pri[j]] = mul(f[i],f[pri[j]],mod)
}
}
ans := 0
for i:=1;i<=n;i++{
ans ^= f[i]
}
fmt.Println(ans)
}
func main() {
//for t := ReadInt(); t > 0; t-- {
work()
//}
close(out)
}
深信服公司福利 749人发布
查看5道真题和解析