http://www.lydsy.com/JudgeOnline/problem.php?id=3309
哇呀线性筛好神奇啊
jcvb:
类似的方法化简得
记,并不是积性函数。
观察的取值可以发现,
;
否则,当时,;
否则,中存在两个质因子的次数不相同,。
上述性质容易通过展开得到证明。
这样,在线性筛的同时记录的最小质因子的次数,以及即可。
//#define _TEST _TEST
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
/************************************************
Code By willinglive Blog:http://willinglive.cf
************************************************/
#define rep(i,l,r) for(int i=(l),___t=(r);i<=___t;i++)
#define per(i,r,l) for(int i=(r),___t=(l);i>=___t;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define LL long long
#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
/
const int N=10001000;
LL a,b;
int prim[1000000],tot,g[N+10],s[N+10];
bool flag[N+10];
int cnt[N+10];//最小质因子的次数
int p[N+10];
/
void init()
{
cnt[1]=1; g[1]=0;
rep(i,2,N)
{
if(!flag[i])
{
prim[++tot]=i;
cnt[i]=1;
p[i]=1;
g[i]=1;
}
for(int j=1;j<=tot && i*prim[j]<=N;j++)
{
int cur=i*prim[j];
flag[cur]=1;
if(i%prim[j]==0)
{
cnt[cur]=cnt[i]+1;
p[cur]=p[i];
if(p[cur]==1) g[cur]=1;
else if(cnt[p[cur]]!=cnt[cur] || g[p[cur]]==0) g[cur]=0;
else g[cur]=-g[p[cur]];
break;
}
else
{
cnt[cur]=1;
p[cur]=i;
if(cnt[p[cur]]!=cnt[cur]||g[p[cur]]==0) g[cur]=0;
else g[cur]=-g[p[cur]];
}
}
}
rep(i,1,N) s[i]=s[i-1]+g[i];
}
/
void input()
{
}
void solve()
{
init();
rep(i,1,read())
{
LL ans=0;
a=read(); b=read();
if(a>b) swap(a,b);
int r;
for(int i=1;i<=a;i=r+1)
{
r=min(a/(a/i),b/(b/i));
ans+=(a/i)*(b/i)*(s[r]-s[i-1]);
}
printf("%lld\n",ans);
}
}
/
int main()
{
input(),solve();
return 0;
}