牛客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)
}
全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
缒梦&独舞:这家公司是这样的,去年给我实习offer了,不过也是面着玩儿的,他周六还要去做公益志愿活动
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务