【题解】于神之怒

题面戳我

\(\text{Solution:}\)

\[\sum_{d=1}^nd^k\sum_{i=1}^\frac{n}{d}\sum_{j=1}^\frac{n}{d}[\gcd(i,j)=1] \]

\[=\sum_{d=1}^n d^k\sum_{x=1}^\frac{n}{d}\mu(x)\lfloor\frac{n}{xd}\rfloor\lfloor\frac{m}{xd}\rfloor \]

\[=\sum_{T=1}^n\sum_{d|T}d^k\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor \]

\[f(T)=\sum_{d|T}d^k\mu(\frac{T}{d}) \]

\[Ans=\sum_{T=1}^nf(T)\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor \]

考虑\(f(T):\)

\[f(T)=\sum_{d|T}d^k\mu(\frac{T}{d}) \]

\[T=id_k*\mu \]

\(h(x)=\mu(x),f(x)=id_k*h\)

对于\(x\in prime:\)

\(h(x)=-1,f(x)=-1+p^k\)

对于\(x\in p^n:\)

\(h(x)=0,f(x)=p^{nk}-p^{nk-k}\)

于是线性筛\(f(T).\)

\(T\)进行整除分块可以做到单次\(O(\sqrt{n})\)的复杂度。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int MAXN=5e6+10;
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){
	int s=0;
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
	char ch=gc();
	while(!isdigit(ch))ch=gc();
	while(isdigit(ch)){
		s=s*10+ch-'0';
		ch=gc();
	}
	return s;
}
inline int add(int x,int y){return (x+y+mod)%mod;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
int T,k,pk[MAXN];
int p[MAXN],cnt,f[MAXN];
bitset<MAXN>vis;
inline int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1)res=mul(res,a);
		a=mul(a,a);b>>=1;
	}
	return res;
}
void predo(){
	int N=5000000;f[1]=1;
	for(int i=2;i<=N;++i){
		if(!vis[i])p[++cnt]=i,pk[cnt]=qpow(i,k),f[i]=pk[cnt]-1,f[i]+=mod,f[i]%=mod;
		for(int j=1;j<=cnt&&i*p[j]<=N;++j){
			vis[i*p[j]]=1;
			if(i%p[j]==0){
				f[i*p[j]]=mul(f[i],pk[j]);
				break;
			}
			f[i*p[j]]=mul(f[i],f[p[j]]);
		}
	}
	for(int i=2;i<=N;++i)f[i]=add(f[i-1],f[i]);
}
int solve(int n,int m){
	int res=0,N=min(n,m);
	for(int l=1,r;l<=N;l=r+1){
		r=min((n/(n/l)),(m/(m/l)));
		res=add(res,mul(f[r]-f[l-1]+mod,mul(n/l,m/l)+mod));
	}
	return res;
}
signed main(){
	T=read(),k=read();
	predo();
	while(T--){
		int n,m;
		n=read(),m=read();
		printf("%lld\n",solve(n,m));
	}
	return 0;
}
posted @ 2020-08-12 20:22  Refined_heart  阅读(84)  评论(0编辑  收藏  举报