柿子应该没推错,有两个点AC,#1#2WA,#3#4AC,其他全部RE
求助/kel
#include<cstdio>
const int M=1e7+5,mod=998244353;
int n,k,top,f[M],id[M],sum[M],pri[M],zhi[M];
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int pow(int a,int b){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*a*ans%mod;
return ans;
}
void sieve(){
int i,j,x;
f[1]=id[1]=zhi[1]=1;
for(i=2;i<=(n<<1);++i){
if(!zhi[i]){
pri[++top]=i;f[i]=i-1;id[i]=pow(i,k);
if(i*i<=n)f[i*i]=mod-i;
}
for(j=1;j<=top&&(x=i*pri[j])<=(n<<1);++j){
zhi[x]=1;
if(!(i%pri[j])){
if(!(i%(pri[j]*pri[j])))f[x]=0;
else f[x]=1ll*f[i/pri[j]]*(mod-pri[j])%mod;
id[x]=1ll*id[i]*id[pri[j]]%mod;
break;
}
f[x]=1ll*f[i]*(pri[j]-1)%mod;
id[x]=1ll*id[i]*id[pri[j]]%mod;
}
}
for(i=1;i<=(n<<1);++i){
f[i]=Add(f[i-1],1ll*f[i]*id[i]%mod);
id[i]=Add(id[i],id[i-1]);
}
for(i=1;i<=n;++i)sum[i]=(1ll*sum[i-1]+id[(i<<1)-1]+id[i<<1]-(id[i]<<1)+mod+mod)%mod;
}
signed main(){
int i,ans=0;
long long tmp;
scanf("%d%lld",&n,&tmp);
k=tmp%(mod-1);
sieve();
for(int L=1,R;L<=n;L=R+1){
R=n/(n/L);
ans+=1ll*(f[R]-f[L-1])*sum[n/L]%mod;
}
printf("%d",ans);
}