[CSP校内集训]2019.10.16数学专题

不羁岁月 提交于 2019-12-01 13:13:36

\(T1:facsum\)

题目

Mr.Hu最近偶得一函数

\[f(n) = n^m \times \sum_{d|n}{\sigma_0(d)\mu(\frac{n}{d})\frac{n}{d}}\]

\(F(n) = \sum_{i=1}^n{f(i)},(n\leq 10^7,m\leq 10)\)

做法

数论函数掠杀我qwq

可以看出右边那个\(\sum\)里面的三个部分都是积性函数,所以它们的乘积也是积性函数,通过计算/打表/瞎猜可知:

\(p\)为质数时,有\(f(p) = 2-p\)

对于\(p^x\),有\(f(p^x) = -x*p + x + 1\)

线性筛一遍即可求解

Code

#include<bits/stdc++.h>
#define N 10000005
#define re register
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
int n,m;
int p[N],d[N],c[N],v[N],cnt;
bool isnotp[N];

template <class T>
void read(T &x)
{
    char c;int sign=1;
    while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
    while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;
}
ll calc(ll x,ll y) {return ((ll)x-x*y+mod+1)%mod;}
void init(int maxn)
{
    c[1]=v[1]=1;
    isnotp[1]=1;
    for(re int i=2;i<=maxn;++i)
    {
        if(!isnotp[i]) p[++cnt]=i,c[i]=i,d[i]=1,v[i]=2-i;
        for(re int j=1;j<=cnt&&(ll)p[j]*i<=maxn;++j)
        {
            isnotp[p[j]*i]=1;
            if(i%p[j]==0)
            {
                c[p[j]*i]=(ll)c[i]*p[j]%mod;
                d[p[j]*i]=d[i]+1;
                v[p[j]*i]=v[i/c[i]]*calc(d[p[j]*i],p[j])%mod;
                break;
            }
            c[p[j]*i]=p[j];
            d[p[j]*i]=1;
            v[p[j]*i]=(ll)v[i]*v[p[j]]%mod;
        }
    }
}
ll quickpow(ll a,ll b)
{
    ll ret=1;
    while(b)
    {
        if(b&1) ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret;
}
int main()
{
    freopen("facsum.in","r",stdin);
    freopen("facsum.out","w",stdout);
    init(N-1);
    read(n);read(m);
    ll ans=0;
    for(re int i=1;i<=n;++i)
    {
        ans=(ans+quickpow(i,m)*v[i])%mod;
    }
    cout<<(ans%mod+mod)%mod<<endl;
    return 0;
}

\(T2:group\)

题目

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!