【bzoj 3309】 DZY Loves Math

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<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;
}

猜你喜欢

转载自blog.csdn.net/tlecoce/article/details/80375998