传送门
感觉这题非常强
假设 n<m
#include
#include
#include
#include
#include
using namespace std;
#define Mod 1000000007
#define LL long long
#define N 5000005
int T,n,m,k;
int p[N],prime[N];
LL ans,f[N];
LL fast_pow(LL a,int p)
{
LL ans=1;
for (;p;p>>=1,a=a*a%Mod)
if (p&1)
ans=ans*a%Mod;
return ans;
}
void get(int n)
{
f[1]=1;
for (int i=2;i<=n;++i)
{
if (!p[i])
{
prime[++prime[0]]=i;
f[i]=(fast_pow(i,k)-1+Mod)%Mod;
}
for (int j=1;j<=prime[0]&&i*prime[j]<=n;++j)
{
p[i*prime[j]]=1;
if (i%prime[j]==0)
{
f[i*prime[j]]=f[i]*fast_pow(prime[j],k)%Mod;
break;
}
else f[i*prime[j]]=f[i]*f[prime[j]]%Mod;
}
}
for (int i=2;i<=n;++i) f[i]=(f[i]+f[i-1])%Mod;
}
int main()
{
scanf("%d%d",&T,&k);
get(5000000);
while (T--)
{
scanf("%d%d",&n,&m);
if (n>m) swap(n,m);
ans=0;
for (int i=1,j=0;i<=n;i=j+1)
{
j=min(n/(n/i),m/(m/i));
ans+=(f[j]-f[i-1])*(n/i)%Mod*(m/i)%Mod;
ans=(ans%Mod+Mod)%Mod;
}
printf("%lld\n",ans);
}
}