2019徐州网络赛 H.function
题意:
先有\(n=p_1^{k_1}p_2^{k_2}\cdots p_m^{k_m}\),定义\(f(n)=k_1+k_2+\cdots+k_m\)。
现在计算
\]
思路:
首先注意到\(f\)函数有这样一个性质:\(f(ab)=f(a)+f(b)\)。
那么我们化简所求式子有:
&\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\)了,那么结果就和上面的差不多。
总结一下,最后推得的式子就为:
\]
发现当\(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的更多相关文章
- 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)); 我们分两 ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- 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], ...
- 2019徐州网络赛 I J M
I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 ...
- 2019南昌网络赛H The Nth Item(打表找询问循环节 or 分段打表)
https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节, ...
- 【树状数组】2019徐州网络赛 query
(2)首先成倍数对的数量是nlogn级别的,考虑每一对[xL,xR](下标的位置,xL < xR)会对那些询问做出贡献,如果qL <= xL && qR >= xR, ...
- query 2019徐州网络赛(树状数组)
query \[ Time Limit: 2000 ms \quad Memory Limit: 262144 kB \] 题意 补题才发现比赛的时候读了一个假题意.... 给出长度为 \(n\) 的 ...
- [2019徐州网络赛J题]Random Access Iterator
题目链接 大致题意:从根节点出发,在节点x有son[x]次等概率进入儿子节点,求到达最深深度的概率.son[x]为x节点的儿子节点个数. 又又又又没做出来,心态崩了. 下来看了官方题解后发觉自己大体思 ...
- 2019徐州网络赛 I.query
这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...
随机推荐
- 优化SQL集一
-->寻找低效的SQL语句 ,下面的语句主要适用于从视图v$sqlarea中获得当前运行下且耗用buffer_gets较多的SQL语句 SELECT exec ...
- JS关于日期格式转换的问题
写Js时,有个地方用到日期,要求是yyyy--MM--dd的格式,于是想到了format函数,下面介绍了时间函数的定义,和调用前引入函数和如何格式化自己想要的日期格式. //当前时间 var Time ...
- xadmin进行全局配置(修改模块名为中文以及其他自定义的操作步骤)
1.实现自定义配置和收缩: 在apps->users->adminx.py中操作如下图内容 2.改成中文 操作如下图所示: 图1: 图2: run重启,刷新页面即可实现如下图: 接下来 ...
- benchmarks (主要用于分布式文件系统性能测试)
最近进行学习过程中,遇到一些可以用得上的benchmark,在这里进行简要记录:之后估计会用到 TensorFlow benchmarks https://github.com/tensorflow/ ...
- 手机号码生成器app,手机上用的
手机号码生成器app,在日常的工作中可能会用到,它是用来找客人用的,不是生成了拿来做手机卡使用的,可能很多人会误解他的功能. 其实他的操作并不复杂,大体分为三步. 第一步,选择省份城市比如我们选择了甘 ...
- day83_11_1 阿里配python使用。
一.环境准备. 1.首先需要在支付包中注册开发者模式,并注册沙箱,模拟支付过程. https://openhome.alipay.com/platform/appDaily.htm?tab=info ...
- Codeforces Round #603 (Div. 2) D. Secret Passwords 并查集
D. Secret Passwords One unknown hacker wants to get the admin's password of AtForces testing system, ...
- python进阶之内存模型
每一个编程语言的背后都有自己独特的内存模型支持,比如最经典的C语言,一个int类型占8字节.那么在python中不区分数据类型,定义一个变量其在内存在占用多少字节呢?python中数据的运算其内存是如 ...
- Selenium+java - 单选框及复选框处理
一.什么是单选框.复选框? 二.被测页面html源代码 CheckBoxRadioDemo.html <!DOCTYPE html> <html lang="en" ...
- TCP协议 - 可靠性
在前篇文章中介绍了TCP协议的三大特性,其中可靠性是依赖一系列的机制,如:校验和,分组发送,超时重传,流量控制得到保证. 一.数据交互 TCP在交互数据时,采用多种机制保证可靠性,同时也保证TCP的性 ...