题意:

先有\(n=p_1^{k_1}p_2^{k_2}\cdots p_m^{k_m}\),定义\(f(n)=k_1+k_2+\cdots+k_m\)。

现在计算

\[\sum_{i=1}^nf(i!)\% 998244353
\]

思路:

首先注意到\(f\)函数有这样一个性质:\(f(ab)=f(a)+f(b)\)。

那么我们化简所求式子有:

\[\begin{aligned}
&\sum_{i=1}^nf(i!)\\
=&\sum_{i=1}^n\sum_{j=1}^if(j)\\
=&\sum_{i=1}^n (n-i+1)f(i)\\
=&(n+1)\sum_{i=1}^nf(i)-\sum_{i=1}^n if(i)\\
\end{aligned}
\]

注意\(f\)并不是积性函数,但是我们根据上面的性质,发现\(\sum_{i=1}^nf(i)\)其实求的就是\(1,2,\cdots,n\)中,每个数的质因子指数和。就和对\(n!\)做质因子分解一样,我们只需要依次考虑每个素数的贡献,那么就可以化为:\((n+1)\sum_{i=1}^n[i\in P]\sum_{k=1}^{34}\lfloor\frac{n}{i^k}\rfloor\)

那后半部分呢?

还是像上面一样,每个质数依次考虑。假设对于质数\(p\)而言,那么所有有贡献的就是\(p,2\cdot p,\cdots,\lfloor\frac{n}{p}\rfloor \cdot p\),每个\(f\)的贡献为\(1\),那么答案就是\((1+2+\cdots+\lfloor\frac{n}{p}\rfloor)p\);对于\(p^2\)而言,每个\(f\)的贡献为\(2\),但是之前在\(p\)的时候已经算上一次,所以贡献就为\(1\)了,那么结果就和上面的差不多。

总结一下,最后推得的式子就为:

\[(n+1)\sum_{i=1}^n[i\in P]\sum_{k=1}^{34}\lfloor\frac{n}{i^k}\rfloor-\sum_{i=1}^n[i\in P]\sum_{k=1}^{34}\frac{\lfloor\frac{n}{i^k}\rfloor(\lfloor\frac{n}{i^k}\rfloor+1)}{2}i^k
\]

发现当\(k>1\)的时候很好处理,直接暴力算就行,照着上面式子写就行。

当\(k=1\)的时候,因为是求每个素数的和,所以可以直接用\(min25\)筛的方法来搞。

细节详见代码吧,感觉也没啥细节,会\(min25\)就行。(然而我把线性筛写错没发现,调了一上午...)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5, MOD = 998244353, inv = 499122177; ll n, z; bool chk[N];
int prime[N], tot;
ll p[N];
void pre() {
for(int i = 2; i <= z; i++) {
if(!chk[i]) {
prime[++tot] = i;
p[tot] = (p[tot - 1] + i) % MOD;
}
for(int j = 1; j <= tot && 1ll * i * prime[j] <= z; j++) {
chk[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
} ll w[N], g1[N], g2[N];
int ind[N], ind2[N];
int cnt;
void calc_g() {
for(ll i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
w[++cnt] = n / i;
if(w[cnt] <= z) ind[w[cnt]] = cnt;
else ind2[n / w[cnt]] = cnt;
g1[cnt] = (w[cnt] - 1) % MOD;
g2[cnt] = w[cnt] % MOD * ((w[cnt] + 1) % MOD) % MOD * inv % MOD - 1;
}
for(int i = 1; i <= tot; i++) {
for(int j = 1; j <= cnt && 1ll * prime[i] * prime[i] <= w[j]; j++) {
ll tmp = w[j] / prime[i], k;
if(tmp <= z) k = ind[tmp]; else k = ind2[n / tmp];
g1[j] -= (g1[k] - i + 1) % MOD;
g2[j] -= 1ll * (p[i] - p[i - 1]) * (g2[k] - p[i - 1]) % MOD;
g1[j] %= MOD; g2[j] %= MOD;
if(g1[j] < 0) g1[j] += MOD;
if(g2[j] < 0) g2[j] += MOD;
}
}
} ll work() {
ll ans = 0;
for(ll i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
ll l = ((i - 1 <= z) ? ind[i - 1] : ind2[(n / (i - 1))]);
ll r = ((j <= z) ? ind[j] : ind2[n / j]);
ans += (n / i) % MOD * ((n + 1) % MOD) % MOD * (g1[r] - g1[l]) % MOD;
ans -= (n / i) % MOD * ((n / i + 1) % MOD) % MOD * inv % MOD * (g2[r] - g2[l]) % MOD;
ans = (ans % MOD + MOD) % MOD;
}
for(int i = 1; i <= tot; i++) {
ll prim = prime[i];
for(; prim * prime[i] <= n;) {
prim *= prime[i];
ans += (n + 1) % MOD * ((n / prim) % MOD) % MOD;
ans %= MOD;
ans -= (n / prim) % MOD * (n / prim + 1) % MOD * inv % MOD * prim % MOD;
ans %= MOD;
}
}
if(ans < 0) ans += MOD;
return ans;
} int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n; z = sqrt(n) + 1;
pre();
calc_g();
cout << work();
return 0;
}

2019徐州网络赛 H.function的更多相关文章

  1. 2019徐州网络赛H :function (min25筛)

    题意:f(i)=i的幂次之和. 求(N+1-i)*f(i)之和. 思路:可以推论得对于一个素数p^k,其贡献是ans=(N+1)[N/(P^k)]+P^k(1+2+3...N/(P^k)); 我们分两 ...

  2. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  3. 2018徐州网络赛H. Ryuji doesn't want to study

    题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ...

  4. 2019徐州网络赛 I J M

    I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 ...

  5. 2019南昌网络赛H The Nth Item(打表找询问循环节 or 分段打表)

    https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节, ...

  6. 【树状数组】2019徐州网络赛 query

    (2)首先成倍数对的数量是nlogn级别的,考虑每一对[xL,xR](下标的位置,xL < xR)会对那些询问做出贡献,如果qL <= xL && qR >= xR, ...

  7. query 2019徐州网络赛(树状数组)

    query \[ Time Limit: 2000 ms \quad Memory Limit: 262144 kB \] 题意 补题才发现比赛的时候读了一个假题意.... 给出长度为 \(n\) 的 ...

  8. [2019徐州网络赛J题]Random Access Iterator

    题目链接 大致题意:从根节点出发,在节点x有son[x]次等概率进入儿子节点,求到达最深深度的概率.son[x]为x节点的儿子节点个数. 又又又又没做出来,心态崩了. 下来看了官方题解后发觉自己大体思 ...

  9. 2019徐州网络赛 I.query

    这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...

随机推荐

  1. linux 的swap、swappiness及kswapd原理【转】

    本文讨论的 swap基于Linux4.4内核代码 .Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑. 希望本文能让读者了解Linux对swap的使用大概是什么样子.阅读完 ...

  2. Docker 运行一个Web应用

    使用 docker 构建一个 web 应用程序. 我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用 参数说明: -d:让容器在后台运行. -P:将容器内部使用的网 ...

  3. python读写Excel方法(xlwt和xlrd)

    在我们做平常工作中都会遇到操作excel,那么今天写一篇,如何通过python操作excel,当然python操作excel的库有很多,比如pandas,xlwt/xlrd,openpyxl等,每个库 ...

  4. 如何查找jdk安装路径也就是JAVA_HOME配置的环境变量

  5. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  6. VIJOS-P1013 强墙

    JDOJ 1198: VIJOS-P1013 强墙 JDOJ传送门 Description ​ 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口 ...

  7. WPF 精修篇 自定义控件

    原文:WPF 精修篇 自定义控件 自定义控件 因为没有办法对界面可视化编辑 所以用来很少 现在实现的是 自定义控件的 自定义属性 和自定义方法 用VS 创建自定义控件后 会自动创建 Themes 文件 ...

  8. CSS修改选中文本颜色与背景色

     壹 ❀ 引 在做博客美化的时候,想着去修改文本选中的背景色,因为网页默认是蓝底白字,看着与自己博客整体配色不太搭配,所以想着去改改.  贰 ❀ ::selection 解决方案其实很简单,使用css ...

  9. 【Linux命令】nohup命令用法

    nohup命令用法 当我们想将某个脚本或程序运行在后台的时候.我们一般会在程序或脚本后面添加 & 字符来表示在后台运行,但使用& 运行在后台,当我们将shell窗口关闭时,该脚本或程序 ...

  10. 安装v2sora@y

    v2r@y安装 1. 安装nginx 这儿使用tengine进行安装, 可以看以前的博客 1.1) 注意带 http_v2 编译 ./configure --with-http_v2_module 不 ...