sb求助sb莫反
  • 板块P6156 简单题
  • 楼主Prean
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/28 16:31
  • 上次更新2023/11/5 14:06:36
查看原帖
sb求助sb莫反
160839
Prean楼主2020/8/28 16:31

柿子应该没推错,有两个点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);
}
2020/8/28 16:31
加载中...