博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WOJ 41 约数统计
阅读量:5232 次
发布时间:2019-06-14

本文共 1352 字,大约阅读时间需要 4 分钟。

只会写60分算法QuQ

考虑到一个数$x$大于$\sqrt{x}$的质因数最多只有一个,我们可以筛出小于$\sqrt{r}$范围内的所有质因数然后直接用这些取分解质因数。

最后扫一遍发现还没有分解完的就累计到答案中去。

所有下标向左平移$l$位。

时间复杂度 $O(√r+ (r−l+ 1)loglog(r−l+ 1))$

Code:

#include 
#include
using namespace std;typedef long long ll;const int N = 1e6 + 5;const ll P = 998244353LL;ll a, b, k, pCnt = 0, pri[N / 10LL], f[N], g[N];bool np[N];inline void sieve() { for(ll i = 2; i <= N; i++) { if(!np[i]) pri[++pCnt] = i; for(ll j = 1; j <= pCnt && pri[j] * i <= N; j++) { np[i * pri[j]] = 1; if(i % pri[j] == 0LL) break; } }}int main() { scanf("%lld%lld%lld", &a, &b, &k); sieve(); for(ll i = a; i <= b; i++) f[i - a] = i, g[i - a] = 1LL; for(ll i = 1; i <= pCnt; i++) { if(pri[i] * pri[i] > b) break; for(ll j = (a / pri[i]) * pri[i]; j <= b; j += pri[i]) { if(j < a) continue; ll t = 0; for(; f[j - a] % pri[i] == 0LL; f[j - a] /= pri[i], t++); g[j - a] = g[j - a] * (t * k + 1LL) % P; } } for(ll i = a; i <= b; i++) if(f[i - a] != 1LL) g[i - a] = (g[i - a] * (k + 1LL)) % P; ll ans = 0LL; for(ll i = a; i <= b; i++) (ans += g[i - a]) %= P; printf("%lld\n", ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9497375.html

你可能感兴趣的文章
Citrix 服务器虚拟化之九 Xenserver虚拟机的XenMotion
查看>>
udisk2阻止自动Mount某些设备
查看>>
django初识
查看>>
IP共享重新验证
查看>>
MySQL优化
查看>>
CentOS系统安装配置mysql
查看>>
jQuery--加一行减一行
查看>>
BZOJ3573 HNOI2014米特运输
查看>>
Ubuntu16安装cx_Oracle
查看>>
java中hashcode()和equals()的详解[转]
查看>>
20155238 2016-2017-2 《JAVA程序设计》第九周学习总结
查看>>
使用 C++ 处理 JSON 数据交换格式
查看>>
使用Gradle自动创建Java项目结构
查看>>
MVC URL处理
查看>>
LeetCode 622. 设计循环队列 (C#实现)——数组,队列
查看>>
nmtui
查看>>
【计算机视觉】【视频处理】开源计算机视觉工具
查看>>
查找searching
查看>>
【DSP开发】CMD文件
查看>>
【算法集中营】CRC16 三种算法及c实现
查看>>