记录编号 232614 评测结果 AAAAAAAAAA
题目名称 [BZOJ 2693] jzptab 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 21.628 s
提交时间 2016-03-02 12:05:59 内存使用 245.42 MiB
显示代码纯文本
#define MAXT 10010
#define ll long long
#define MAXN 10000010
#define Min(a,b)((a)<(b)?(a):(b))
#define Max(a,b)((a)>(b)?(a):(b))

#include<cstdio>

using namespace std;

const ll Mod=100000009;bool vis[MAXN];
ll Case,n[MAXT],m[MAXT],p[MAXN>>4],mu[MAXN],sum[MAXN],MAX,tot,Ans,Mul[MAXN];

inline void get_p()
{
	sum[1]=1;mu[1]=1;Mul[1]=1;
	for(ll i=2;i<=MAX;i++){
		if(!vis[i])p[++tot]=i,mu[i]=-1,sum[i]=(i-i*i)%Mod;
		for(ll j=1;j<=tot&&(i*p[j])<=MAX;j++){
			vis[p[j]*i]=true;
			if(!(i%p[j])){
				mu[i*p[j]]=0;
				sum[i*p[j]]=(sum[i]*p[j])%Mod;
				break;
			}
			mu[i*p[j]]=-mu[i];
			sum[i*p[j]]=(sum[i]*sum[p[j]])%Mod;
		}
		Mul[i]=(i*(i+1)/2)%Mod;
	}
	for(ll i=2;i<=MAX;i++)sum[i]=(sum[i]+sum[i-1])%Mod;
}

inline void get_ans(ll now)
{
	ll last=0;Ans=0;
	for(ll i=1,r=Min(n[now],m[now]);i<=r;i=last+1){
		last=Min(n[now]/(n[now]/i),m[now]/(m[now]/i));
		Ans=(Ans+(sum[last]-sum[i-1])*Mul[n[now]/i]%Mod*Mul[m[now]/i])%Mod;
	}
	printf("%lld\n",(Ans%Mod+Mod)%Mod);
}

int main()
{
    freopen("bzoj_2693.in","r",stdin);
	freopen("bzoj_2693.out","w",stdout);
	scanf("%lld",&Case);
	for(ll i=1;i<=Case;i++){
		scanf("%lld%lld",&n[i],&m[i]);
		MAX=Max(Max(n[i],m[i]),MAX);
	}
	get_p();for(ll i=1;i<=Case;i++)get_ans(i);
}