正题
题目链接:https://www.luogu.com.cn/problem/P4449
题目大意
TTT组询问给出n,mn,mn,m求∑i=1n∑j=1mgcd(i,j)k\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^ki=1∑nj=1∑mgcd(i,j)k
解题思路
∑i=1n∑j=1mgcd(i,j)k\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^ki=1∑nj=1∑mgcd(i,j)k
∑d=1ndk∑i=1n∑j=1m[gcd(i,j)==d]\sum_{d=1}^nd^k\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]d=1∑ndki=1∑nj=1∑m[gcd(i,j)==d]
f(x)=∑i=1n∑j=1m[gcd(i,j)==x]f(x)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==x]f(x)=i=1∑nj=1∑m[gcd(i,j)==x]
F(x)=∑x∣if(i)F(x)=\sum_{x|i}f(i)F(x)=x∣i∑f(i)
F(x)=⌊nx⌋⌊mx⌋F(x)=\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{x}\rfloorF(x)=⌊xn⌋⌊xm⌋
f(x)=∑x∣iF(x)=∑x∣iμ(ix)⌊ni⌋⌊mi⌋f(x)=\sum_{x|i}F(x)=\sum_{x|i}\mu(\frac{i}{x})\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloorf(x)=x∣i∑F(x)=x∣i∑μ(xi)⌊in⌋⌊im⌋
∑x=1n⌊nx⌋⌊mx⌋∑x∣iμ(ix)ik\sum_{x=1}^n\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{x}\rfloor\sum_{x|i}\mu(\frac{i}{x})i^kx=1∑n⌊xn⌋⌊xm⌋x∣i∑μ(xi)ik
然后预处理∑x∣iμ(ix)ik\sum_{x|i}\mu(\frac{i}{x})i^k∑x∣iμ(xi)ik的前缀和即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e6+10,XJQ=1e9+7;
ll T,k,n,m,cnt,mu[N],g[N],pw[N],pri[N];
bool vis[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void prime(){g[1]=1;for(ll i=2;i<N;i++){if(!vis[i]){pri[++cnt]=i;pw[cnt]=power(i,k);g[i]=(pw[cnt]-1+XJQ)%XJQ;}for(ll j=1;i*pri[j]<N&&j<=cnt;j++){vis[i*pri[j]]=1;if(i%pri[j]==0){g[i*pri[j]]=g[i]*pw[j]%XJQ;break;}g[i*pri[j]]=g[i]*g[pri[j]]%XJQ;}}for(ll i=1;i<N;i++)g[i]=(g[i-1]+g[i])%XJQ;return;
}
int main()
{scanf("%lld%lld",&T,&k);prime();while(T--){scanf("%lld%lld",&n,&m);if(n>m)swap(n,m);ll ans=0;for(ll l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));(ans+=(n/l)*(m/l)%XJQ*(g[r]-g[l-1]+XJQ)%XJQ)%=XJQ;}printf("%lld\n",(ans+XJQ)%XJQ);}
}