Loj #125. 除数函数求和(2)
link : https://loj.ac/problem/125
分块calc即可。
#include<bits/stdc++.h> #define ll long long using namespace std; const int ha=998244353; int n,ans[3]; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x; } inline int ci0(int x){ return x%ha; } inline int ci1(int x){ return (x*(ll)(x+1)>>1)%ha; } inline int ci2(int x){ ll u=x*(ll)(x+1)>>1; if(!(u%3)) return u/3%ha*(ll)(2*x+1)%ha; else return u%ha*(ll)((2*x+1)/3)%ha; } inline int calc(){ int an[3]; an[0]=an[1]=an[2]=0; for(int i=1,j,now;i<=n;i=j+1){ now=n/i,j=n/now; an[0]=add(an[0],add(ci0(j),ha-ci0(i-1))*(ll)now%ha); an[1]=add(an[1],add(ci1(j),ha-ci1(i-1))*(ll)now%ha); an[2]=add(an[2],add(ci2(j),ha-ci2(i-1))*(ll)now%ha); } return (an[0]*5ll+an[1]*3ll+an[2]*2ll)%ha; } int main(){ scanf("%d",&n); printf("%d\n",calc()); return 0; }
我爱学习,学习使我快乐