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
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957
Sample Output
35793453939901
14225956593420
4332838845846
15400094813
14225956593420
4332838845846
15400094813
HINT
【数据规模】
T<=10000
1<=a,b<=10^7
这道题是可以用莫比乌斯反演,下面是程序:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=1e7+5;
bool z[N];
int p[N],g[N],mn[N],a[N],l;
void work(){
int i,j,tp;
for(i=2;i<=1e7;i++){
if(!z[i]){
a[i]=p[++l]=i;
mn[i]=g[i]=1;
}
for(j=1;(tp=i*p[j])<=1e7&&j<=l;j++){
z[tp]=1;
if(!(i%p[j])){
mn[tp]=mn[i]+1;
a[tp]=a[i]*p[j];
if(i==a[i]){
g[tp]=1;
}
else{
g[tp]=(mn[tp]==mn[i/a[i]]?-g[i/a[i]]:0);
}
break;
}
mn[tp]=1;
a[tp]=p[j];
g[tp]=(mn[i]==1?-g[i]:0);
}
}
for(i=1;i<=1e7;i++){
g[i]+=g[i-1];
}
}
long long f(int a,int b){
int i,last;
long long s=0;
if(a>b){
swap(a,b);
}
for(i=1;i<=a;i=last+1){
last=min(a/(a/i),b/(b/i));
s+=(long long)(g[last]-g[i-1])*(a/i)*(b/i);
}
return s;
}
int main(){
work();
int t,a,b;
scanf("%d",&t);
while(t--){
scanf("%d%d",&a,&b);
printf("%lld\n",f(a,b));
}
return 0;
}