记录编号 230836 评测结果 AAAAAAAAAA
题目名称 [BZOJ 4407] 于神之怒加强版 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 6.836 s
提交时间 2016-02-24 12:04:24 内存使用 26.01 MiB
显示代码纯文本
#define maxn 5000002ul

#include <stdio.h>

int sum[maxn],T,cnt,K,prime[maxn>>3],ksm_ret[maxn>>3];
bool isp[maxn];
const int mod=1e9+7;

int ksm(int p,int k){
	int ans=1;
	while(k){
		if(k&1) ans=(1ll*ans*p)%mod;
		k>>=1,p=(1ll*p*p)%mod;
	}
	return ans;
}

int Min(int a,int b){
	return a<b?a:b;
}

int work(int n,int m){
	int ans=0;
	if(n>m) n^=m,m^=n,n^=m;
	for(int i=1,last;i<=n;i=last+1){
		last=Min(n/(n/i),m/(m/i));
		(ans+=(1ll*(sum[last]-sum[i-1])*(1ll*(n/i)*(m/i)%mod))%mod)%=mod;
	}
	return (ans%mod+mod)%mod;
}

int main(){
	freopen("bzoj_4407.in","r",stdin);
	freopen("bzoj_4407.out","w",stdout);
	scanf("%d%d",&T,&K),sum[1]=1;
	for(int i=2;i<maxn;i++){
		if(!isp[i]) prime[++cnt]=i,sum[i]=ksm_ret[cnt]=ksm(i,K),sum[i]--;
		for(int j=1,x;j<=cnt&&i*prime[j]<maxn;j++){
			x=i*prime[j],isp[x]=true;
			if(i%prime[j]) sum[x]=(1ll*sum[i]*ksm_ret[j]-sum[i])%mod;
			else{sum[x]=(1ll*sum[i]*ksm_ret[j])%mod;break;}
		}
		(sum[i]+=sum[i-1])%=mod;
	}
	for(int i=1,a,b;i<=T;i++){
		scanf("%d%d",&a,&b);
		printf("%d\n",work(a,b));
	}
	return 0;
}