當(dāng)前位置:
首頁(yè) >
loj124 除数函数求和 1
發(fā)布時(shí)間:2023/10/11
121
老码农
生活随笔
收集整理的這篇文章主要介紹了
loj124 除数函数求和 1
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
loj124 除數(shù)函數(shù)求和 1
$\sum_{i=1}^n(\sum_{d|i}d^k)=\sum_{i=1}^n(i^k*{\lfloor}{\frac{n}{i}}{\rfloor})$
不能直接數(shù)論分塊了,但是一看數(shù)據(jù)范圍,可以線(xiàn)性篩啊
怎么篩呢?可以把所有的$i^k$篩出來(lái)。就是質(zhì)數(shù)直接算,其他的根據(jù)$(a*b)^k=a^k*b^k$在被篩掉的時(shí)候遞推出來(lái)。
#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 ;
}
總結(jié)
以上是生活随笔為你收集整理的loj124 除数函数求和 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: socket INADDR_ANY
- 下一篇: 【命令】GETBIT/SETBIT