http://blog.csdn.net/w_yqts/article/details/78970490
Orz w_yqts
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define p 1000000007
#define N 5000005
inline int read()
{
char ch=getchar();
int x=0;
while ('0'>ch || ch>'9') ch=getchar();
while ('0'<=ch && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x;
}
inline int power(int x,int m)
{
ll s1=1LL,s2=(ll)x;
while (m)
{
if (m&1) s1=s1*s2%p;
m>>=1;
s2=s2*s2%p;
}
return s1;
}
int pn,g[N],pr[N],flag[N],mi[N],k;
inline void solve()
{
ll ans=0LL;
int n=read(),m=read();
if (n>m) swap(n,m);
for (int i=1,pos;i<=n;i=pos+1)
{
pos=min(n/(n/i),m/(m/i));
ans=(ans+(ll)(n/i)*(m/i)%p*(g[pos]-g[i-1]))%p;
}
printf("%d\n",(ans+p)%p);
}
int main()
{
int T;
T=read(),k=read();
flag[1]=1;g[1]=1;
for (int i=2;i<=5000000;++i)
{
if (!flag[i])
{
pr[++pn]=i;
mi[pn]=power(i,k);
g[i]=mi[pn]-1;
}
for (int j=1;j<=pn && pr[j]*i<=5000000;++j)
{
flag[i*pr[j]]=1;
if (i%pr[j]==0)
{
g[i*pr[j]]=(ll)(g[i])*mi[j]%p;
break;
}
g[i*pr[j]]=(ll)(g[i])*g[pr[j]]%p;
}
}
for (int i=2;i<=5000000;++i) g[i]=(g[i]+g[i-1])%p;
while (T--) solve();
}