题意:
给你一个区间[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 ",ans); } int main() { //freopen("in.txt","r",stdin); int t; scanf("%d",&t);for(int i=1;i<=t;i++)solve(); }