因子k次幂之和

题意:

给你一个区间[L,R],求L到R的所有数的因子的k次幂之和

思路:

对于(1—r)每个数,求它的因子和。如何求呢?我们可以枚举(i=1-r),以i作为因子的iki^k,然后对于每个有以i为因子的数都加上它,对于每个数的因子次幂和放到a[i]数组里。例如以2为因子的有2,4,6,8,10…,然后以3为因子的有3,6,9,12…具体意思看代码应该能明白

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll a[1000500];
ll quick(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}
void solve()
{
    int l,r,k;
    scanf("%d%d%d",&l,&r,&k);
    memset(a,0,sizeof(a));
    for(int i=1;i<=r;i++)
    {
        ll x=quick(i,k);
        for(int j=i;j<=r;j+=i)//以i为因子的,2i,3i,4i,5i...
            a[j]=(a[j]+x)%mod;
    }
    ll ans=0;
    for(int i=l;i<=r;i++)
        ans=(ans+a[i])%mod;
    printf("%lld\n",ans);
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);for(int i=1;i<=t;i++)solve();
}

猜你喜欢

转载自www.cnblogs.com/zzl-dreamfly/p/11982780.html