题目描述
食堂第iii天有iii道菜.CYJian觉得第i天的第j道菜的美味程度为{ij}\lbrace \frac{i}{j} \rbrace{ji}({}就是取小数部分),当然,CYJian是一个勇于尝试的人,所以每一道菜都会吃那么一点.现在CYJian有T个问题,每一个问题都是从第AiA_iAi天到第BiB_iBi天得到的美味值的总和.现在请你帮他算一算吧!请输出答案模998244353998244353998244353的值.
输入格式
第一行一个数T。
接下来T行,每一行一共两个数,表示每一次询问的A和B。
输出格式
T行,每行一个正整数表示美味值之和.如果答案可以表示成PQ\frac{P}{Q}Q
P的形式,则需要找到任意一个x使得Q×x≡P( mod 998244353)Q \times x \equiv P (\bmod\ 998244353)Q×x≡P(mod 998244353),并且输出x mod 998244353x \bmod 998244353xmod998244353
输入输出样例
输入 #1
1
1 3
输出 #1
499122177
说明/提示
数据范围:
数据点范围 T= A⩽B⩽
20,106,10620,10^6,10^620,106,106
解释:设f(n)=∑in∑j=1i(ij−[ij])=∑in∑j=1ii∗j−1−∑in∑j=1i[ij]f(n)=\sum_i^n\sum_{j=1}^i(\frac{i}{j}-[\frac{i}{j}])=\sum_i^n\sum_{j=1}^ii*j^{-1}-\sum_i^n\sum_{j=1}^i[\frac{i}{j}]f(n)=∑in∑j=1i(ji−[ji])=∑in∑j=1ii∗j−1−∑in∑j=1i[ji]
第一部分∑in∑j=1ii∗j−1=∑ini∗∑j=1ij−1\sum_i^n\sum_{j=1}^ii*j^{-1}=\sum_i^ni*\sum_{j=1}^ij^{-1}∑in∑j=1ii∗j−1=∑ini∗∑j=1ij−1因此我们可以预处理出来就OK
第二部分有个结论∑i=1nd(i)=∑i=1n[ni]\sum_{i=1}^nd(i)=\sum_{i=1}^n[\frac{n}{i}]∑i=1nd(i)=∑i=1n[in]因此我们可以预处理出来,再求和就OK
#include<iostream>
#include<cstdio>
#define ll long long
#define N 1000003
#define mod 998244353
using namespace std;
ll inv[N]={0};
ll mk[N]={0};
ll c33[N]={0};
int main(){
inv[1]=1;
for(int i=2;i<N;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
for(int i=1;i<N;i++) inv[i]=(inv[i-1]+inv[i])%mod;
for(int i=1;i<N;i++) mk[i]=i*inv[i]%mod;
for(int i=1;i<N;i++) mk[i]=(mk[i]+mk[i-1])%mod;
for(int i=1;i<N;i++) for(int j=i;j<N;j+=i) c33[j]++;
for(int i=1;i<N;i++) c33[i]=(c33[i-1]+c33[i])%mod;
for(int i=1;i<N;i++) c33[i]=(c33[i-1]+c33[i])%mod;
int T=0;scanf("%d",&T);
while(T--){
int l=0,r=0;scanf("%d%d",&l,&r);
ll ret=(mk[r]-mk[l-1]-c33[r]+c33[l-1])%mod;
ret+=mod;ret%=mod;
printf("%lld\n",ret);
}
return 0;
}
这是一篇关于洛谷食堂问题的解析博客,主要讨论了如何计算从第Ai天到第Bi天所有菜品的美味值总和,该总和模998244353的结果。文章提到了利用数学技巧对数据进行预处理,以解决T个查询问题。给出的样例显示,当从第1天到第3天计算美味值时,答案是499122177。博客内容涉及数学和算法的应用。
631

被折叠的 条评论
为什么被折叠?



