题解 P4900 食堂

一道推式子的数学题。

i=lrj=1i{ji}=i=lrj=1i(jiji)=i=lrj=1ijii=lrj=1iji

g(x)1x 的所有数的约数个数之和。即:i=1xxi

则最终式子可以化简为:i=lr[i(j=1ij1)]i=lrg(i)

第一项和第二项均可用两次前缀和预处理。

预处理 O(nlogn),查询 O(1)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 5, N2 = 1e6 + 5, mod = 998244353;
ll T, s = 0, inv[N2], cnt[N2], x[N2], f[N2];
ll getans(ll n) {return (x[n] - f[n] + mod) % mod;}
int main() {
    inv[1] = s = x[1] = f[1] = cnt[1] = 1;
    for (ll i = 2; i <= 1e6; ++i) {
    	inv[i] = (mod - mod / i * inv[mod % i] % mod) % mod;
		s = (s + inv[i]) % mod;
		x[i] = (x[i - 1] + i * s) % mod;
	}
    for (ll i = 2; i <= 1e6; ++i) {
        ++cnt[i];
        for (int j = i; j <= 1e6; j += i) ++cnt[j];
    }
    s = 0;
    for (int i = 1; i <= 1e6; ++i) s = (s + cnt[i]) % mod, f[i] = (f[i - 1] + s) % mod;
    scanf("%d", &T); 
    while (T--) {
        ll p, q; scanf("%lld%lld", &p, &q);
        printf("%lld\n", (getans(q) - getans(p - 1) + mod) % mod);
    }
    return 0;
}

本文作者:HQJ2007

本文链接:https://www.cnblogs.com/HQJ2007/p/17561272.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   HQJ2007  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起