题解:P12599 常数要较小
题目传送门。
典。不明白
思路
以下除法默认整除。
一般人看到这种式子就直接上数论分块了,事实上这个式子是可以预处理的。
考虑
时间复杂度
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int Mod=998244353;
const int Maxn=1e6+7;
int T,n;
int mu[Maxn];
vector<int>divs[Maxn];
int ans[Maxn];
int f[Maxn];
void init(int N){
for(int i=1;i<=N;i++){
mu[i]+=(i==1);
for(int j=i+i;j<=N;j+=i) mu[j]-=mu[i],divs[j].emplace_back(i);
}
for(int i=1;i<=N;i++){
ans[i]=ans[i-1];
for(auto j:divs[i]){
int w=mu[j]*1ll*j*j%Mod;
int delt=((i/j)*mu[i]+f[j])%Mod;
int val=(1ll*delt*delt-1ll*f[j]*f[j])%Mod;
ans[i]=(ans[i]+1ll*w*val)%Mod;
f[j]=delt;
}
f[i]=mu[i];
ans[i]=(ans[i]+abs(f[i])*mu[i]*1ll*i*i)%Mod;
}
}
int main(){
scanf("%d",&T);
init(1e6);
while(T--){
scanf("%d",&n);
ans[n]=(ans[n]%Mod+Mod)%Mod;
printf("%d\n",ans[n]);
}
system("pause");
return 0;
}