给下N,M,K.求$$\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^k\mod (10^9+7)$$
1<=N,M,K<=5000000,1<=T<=2000
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 5000010
#define MOD 1000000007LL
using namespace std;
int k=0,prime[MAXN];
long long p,f[MAXN],g[MAXN],sum[MAXN];
bool np[MAXN];
inline int read(){
int date=0,w=1;char c=0;
while(c<‘0‘||c>‘9‘){if(c==‘-‘)w=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){date=date*10+c-‘0‘;c=getchar();}
return date*w;
}
long long mexp(long long a,long long b,long long c){
long long s=1;
while(b){
if(b&1)s=s*a%c;
a=a*a%c;
b>>=1;
}
return s;
}
void make(){
int m=MAXN-10;
f[1]=g[1]=1;
for(int i=2;i<=m;i++){
if(!np[i]){
prime[++k]=i;
g[i]=mexp(i,p,MOD);
f[i]=g[i]-1;
}
for(int j=1;j<=k&&prime[j]*i<=m;j++){
np[prime[j]*i]=true;
if(i%prime[j]==0){
f[prime[j]*i]=f[i]*g[prime[j]]%MOD;
break;
}
f[prime[j]*i]=f[i]*f[prime[j]]%MOD;
}
}
for(int i=1;i<=m;i++)sum[i]=(sum[i-1]+f[i])%MOD;
}
long long solve(long long n,long long m){
long long ans=0;
if(n>m)swap(n,m);
for(int i=1,last=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
ans=(ans+(sum[last]-sum[i-1]+MOD)%MOD*(n/i)%MOD*(m/i)%MOD)%MOD;
}
return ans;
}
int main(){
int t=read();
p=read();
make();
while(t--){
int n=read(),m=read();
printf("%lld\n",solve(n,m));
}
return 0;
}
原文:https://www.cnblogs.com/Yangrui-Blog/p/9462460.html