版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq872425710/article/details/82807841
题目大意:
小w是欧拉的粉丝
众所周知
现在小w想求这个东西
有m次询问,每次询问F(n)对998244353取mod
思路:
每一个项分类讨论,线性筛出mu,然后预处理d^k,枚举一个d然后就好了
程序:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define LL long long
#define N 5000005
const int mo=998244353;
LL f[N],o;
int n,m,k,cnt,np[N],p[N],mu[N];
LL mul(int x,int y){
if (y==1) return x;
LL o=mul(x,y/2);
o=(o*o)%mo;
if (y%2==1) o=(o*x)%mo;
return o;
}
void getmu(LL n){
mu[1]=1;
for (LL i=2;i<=n;i++){
if (!np[i]){
mu[i]=-1;
p[++cnt]=i;
}
for (LL j=1;j<=cnt&&i*p[j]<=n;j++){
np[i*p[j]]=1;
if (i%p[j]==0){
mu[i*p[j]]=0;
break;
}
mu[i*p[j]]=-mu[i];
}
}
}
int main(){
freopen("a.in","r",stdin);
scanf("%d%d",&m,&k);
getmu(5000000);
for (int i=1;i<=5000000;i++)
{
LL o=mul(i,k);
for (int j=1;j<=5000000/i;j++)
f[i*j]=(f[i*j]+o*mu[j]%mo+mo)%mo;
}
for (int i=1;i<=m;i++){
scanf("%d",&n);
printf("%lld\n",f[n]);
}
}