bzoj3309DZY Loves Math

时间:2023-03-09 08:09:46
bzoj3309DZY Loves Math

3309: DZY Loves Math

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 1240  Solved: 777
[Submit][Status][Discuss]

Description

对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b)。

Input

第一行一个数T,表示询问数。
接下来T行,每行两个数a,b,表示一个询问。

Output

对于每一个询问,输出一行一个非负整数作为回答。

Sample Input

4
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957

Sample Output

35793453939901
14225956593420
4332838845846
15400094813

HINT

【数据规模】

T<=10000

1<=a,b<=10^7

 #include<bits/stdc++.h>
#define rint register int
#define N 10000001
using namespace std;
int cnt,sum[N],a[N],b[N],p[N>>],vis[N]; int main(){
for(rint i=;i<N;++i){
if(!vis[i]){p[++cnt]=i;a[i]=sum[i]=;b[i]=i;}
for(rint j=;j<=cnt&&p[j]*i<N;++j){
static int k,t;k=p[j]*i;vis[k]=;
if(i%p[j]){a[k]=;b[k]=p[j];sum[k]= a[i]==?-sum[i]:;}
else{
a[k]=a[i]+;b[k]=b[i]*p[j];t=i/b[i];
if(t==)sum[k]=;else sum[k]= a[t]==a[k]?-sum[t]:;
break;
}
}
}
for(rint i=;i<N;++i)sum[i]+=sum[i-];
int T,n,m,pos;long long ans;scanf("%d",&T);
for(rint c=;c<=T;++c){
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);ans=;
for(rint i=;i<=n;i=pos+){
pos=min(n/(n/i),m/(m/i));
ans+=1ll*(n/i)*(m/i)*(sum[pos]-sum[i-]);
}
printf("%lld\n",ans);
}
return ;
}