牛客 188E

版权声明:本文为博主原创文章,未经博主允许不得转载。 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]);
	}
}

猜你喜欢

转载自blog.csdn.net/qq872425710/article/details/82807841