有毒的数学公式
题解
中d表示i的因子,即i的因子的k次方之和
不能直接快速幂求解!因为数据缘故给骗过去一个o.....orz
两个难点
1、积性函数
已知条件(优化直接快速幂)
由此用线性筛把每个数的 k 次方求解出来(直接快速幂求质数的k次方,合数的k次方利用两质数的k次方相乘得到)
2、约数和
可以发现就是从 1 到 n ,每个数约数的 k次方 和,再求和;简单来说,1~n里面存在n/i个i因子,k次方后求和即可。
CODE
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
#define ll long long
#define maxn 10000000
ll prime[maxn+7],p[maxn+7];
int vis[maxn+7];
ll n,k;
ll ksm(ll a,ll b)
{
ll r=1,base=a;
while(b!=0)
{
if(b%2)
r=r*base%mod;
base=base*base%mod;
b/=2;
}
return r%mod;
}
void shai()
{
p[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
{
prime[++prime[0]]=i;
p[i]=ksm(i,k);
}
for(int j=1;j<=prime[0]&&i*prime[j]<=maxn;j++)
{
vis[i*prime[j]]=1;
p[i*prime[j]]=p[i]*p[prime[j]]%mod;
if(i%prime[j]==0)
{
break;
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin>>n>>k;
shai();
ll ans=0;
for(int i=1;i<=n;i++)
{
ans=(ans+n/i*p[i])%mod;
}
cout<<ans<<endl;
return 0;
} 
京公网安备 11010502036488号