Loj #124. 除数函数求和

链接:https://loj.ac/problem/124

 

就是筛一下积性函数。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<bits/stdc++.h>
#define ll long long
#define maxn 10000000
#define ha 1000000007
using namespace std;
int zs[maxn/10],t=0;
int low[maxn+5];
int f[maxn+5];
int mik[maxn+5];
bool v[maxn+5];
int n,k;
 
inline int ksm(int x,int y){
    int an=1;
    for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
    return an;
}
 
inline int add(int x,int y){
    x+=y;
    return x>=ha?x-ha:x;
}
 
inline void init(){
    low[1]=1,f[1]=1;
     
    for(int i=2;i<=n;i++){
        if(!v[i]) zs[++t]=i,low[i]=i,mik[i]=ksm(i,k),f[i]=add(mik[i],1);
        for(int j=1,u;j<=t&&(u=zs[j]*i)<=n;j++){
            v[u]=1;
            if(!(i%zs[j])){
                low[u]=low[i]*zs[j];
                if(low[i]==i) f[u]=add(f[i]*(ll)mik[zs[j]]%ha,1);
                else f[u]=f[i/low[i]]*(ll)f[low[u]]%ha;
                break;
            }
            low[u]=zs[j],f[u]=f[i]*(ll)(mik[zs[j]]+1)%ha;
        }
    }
     
    for(int i=1;i<=n;i++) f[i]=add(f[i],f[i-1]);
}
 
int main(){
    cin>>n>>k;
    init();
    cout<<f[n]<<endl;
    return 0;
}

  

posted @   蒟蒻JHY  阅读(458)  评论(0编辑  收藏  举报
编辑推荐:
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入
· .NET 开发的分流抢票软件,不做广告、不收集隐私
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 实现windows下简单的自动化窗口管理
· 前端实现 HTML 网页转 PDF 并导出
点击右上角即可分享
微信分享提示