记录编号 230829 评测结果 AAAAAAAAAA
题目名称 [BZOJ 4407] 于神之怒加强版 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 19.742 s
提交时间 2016-02-24 11:36:41 内存使用 107.59 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const LL MOD=1000000007;
const int SIZEN=5000010,SIZET=2010;
int T,K;
int n[SIZET],m[SIZET];
int maxn=0;
bool co[SIZEN]={0};
int pri[SIZEN],mu[SIZEN];
LL F[SIZEN];
LL f[SIZEN];
int cnt=0;
LL qpow(LL x,int y)
{
	LL re=1;
	while(y)
	{
		if(y&1) re*=x;
		y>>=1;x*=x;re%=MOD;x%=MOD;
	}
	return re;
}
void prepare()
{
	for(int i=1;i<=maxn;i++) mu[i]=1,F[i]=1;
	for(LL i=2;i<=maxn;i++)
	{
		if(!co[i])
		{
			pri[++cnt]=i;
			mu[i]=-1;
			f[i]=qpow(i,K);f[i]%=MOD;
			F[i]=(f[i]-1+MOD)%MOD;
			for(LL j=2*i;j<=maxn;j+=i)
			{
				co[j]=1;
				if(j%(i*i)==0) {mu[j]=0;F[j]=F[j/i]*f[i];F[j]%=MOD;}
				else {mu[j]*=(-1);F[j]*=F[i];F[j]%=MOD;}
			}
		}
	}
	F[0]=0;F[1]=1;
	//for(int i=1;i<=100;i++) cout<<F[i]<<endl;
	for(int i=1;i<=maxn;i++) F[i]+=F[i-1],F[i]%=MOD;
}
void clac(LL N,LL M)
{
	int j=0;
	LL ans=0;
	for(LL i=1;i<=min(N,M);i=j+1)
	{
		j=min(N/(N/i),M/(M/i));
		ans+=((F[j]-F[i-1]+MOD)%MOD)*(N/i)%MOD*(M/i)%MOD;
		ans%=MOD;
	}
	printf("%I64d\n",ans);
}
int main()
{
	freopen("bzoj_4407.in","r",stdin);
	freopen("bzoj_4407.out","w",stdout);
	scanf("%d%d",&T,&K);
	for(int i=1;i<=T;i++)
	{
		scanf("%d%d",&n[i],&m[i]);
		maxn=max(maxn,max(n[i],m[i]));
	}
	prepare();
	for(int i=1;i<=T;i++)
	{
		int N=n[i],M=m[i];
		clac(N,M);
	}
	return 0;
}