首页 > 其他 > 详细

Count

时间:2019-05-08 20:29:53      阅读:128      评论:0      收藏:0      [点我收藏+]

题目链接:点这里

题目意思:令f(x)表示<=x的正整数中与x互质的数的平均数*2,求sigma(f(i)^k),L<=i<=R

Solution:

首先,我们定义\(S(x)=\sum_{gcd(a,x)=1}a\),因为gcd(a,x)=1,所以对于任意a,满足gcd(x-a,x)=1

我们知道满足条件的a只有\(\phi(x)\)个,所以可以得到\(S(x)=\frac{\phi(x)x}{2}\)

我们要求的\(f(x)=2\frac{S(x)}{\phi(x)}\),可以得到\(f(x)=x\),于是可以得到我们要求的数为\(\sum_{i=L}^R i^k\)

于是我们可以直接用拉格朗日插值来求

Code:

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int N=1e6+1;
int l,r,k,u,ans,pro,f[N],fac[N]={1};
int quickpow(int x,int y){
    int re=1;
    while(y){
        if(y&1) re=re*x%mod;
        x=x*x%mod;y>>=1;
    }return re%mod;
}
void prepare(){
    for(int i=1;i<=k+2;i++)
        f[i]=(f[i-1]+quickpow(i,k))%mod;
    for(int i=1;i<=k+2;i++)
        fac[i]=fac[i-1]*i%mod;
}
int Lagrange(int n){
    pro=1,ans=0;
    for(int i=1;i<=k+2;i++)
        pro=pro*(n-i)%mod;
    for(int i=1;i<=k+2;i++){
        int inv1=quickpow(n-i,mod-2);
        int inv2=quickpow((fac[i-1]%mod*fac[k+2-i])%mod,mod-2);
        int sign=(k+2-i)&1?-1:1;
        ans=(ans+sign*inv1*inv2%mod*f[i]%mod*pro%mod)%mod;
    }return (ans+mod)%mod;
}
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
signed main(){
    l=read(),r=read(),k=read();
    prepare();u=(l<=k+3)?f[l-1]:Lagrange(l-1);
    int now;now=(r>k+2)?Lagrange(r):f[r];
    printf("%lld\n",(now-u+mod)%mod);
    return 0;
}

Count

原文:https://www.cnblogs.com/NLDQY/p/10833607.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!