loj124 除数函数求和 1
生活随笔
收集整理的這篇文章主要介紹了
loj124 除数函数求和 1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
loj124 除數函數求和 1
$\sum_{i=1}^n(\sum_{d|i}d^k)=\sum_{i=1}^n(i^k*{\lfloor}{\frac{n}{i}}{\rfloor})$
不能直接數論分塊了,但是一看數據范圍,可以線性篩啊
怎么篩呢?可以把所有的$i^k$篩出來。就是質數直接算,其他的根據$(a*b)^k=a^k*b^k$在被篩掉的時候遞推出來。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 10000010
#define md 1000000007
bool nprime[N+];int prime[N+],len;
ll A[N+],ans,n,k;
ll poww(ll a,ll b)
{
ll base=a,ans=;
while(b)
{
if(b&) ans=ans*base%md;
base=base*base%md;
b>>=;
}
return ans;
}
int main()
{
ll i,j;
scanf("%lld%lld",&n,&k);
A[]=;
for(i=;i<=n;i++)
{
if(!nprime[i]) prime[++len]=i,A[i]=poww(i,k);
for(j=;j<=len&&i*prime[j]<=n;j++)
{
nprime[i*prime[j]]=;
A[i*prime[j]]=A[i]*A[prime[j]]%md;
if(i%prime[j]==) break;
}
}
for(i=;i<=n;i++) ans=(ans+A[i]*(n/i)%md)%md;
printf("%lld",ans);
return ;
}
總結
以上是生活随笔為你收集整理的loj124 除数函数求和 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket INADDR_ANY
- 下一篇: 【命令】GETBIT/SETBIT