思路: 求出 x与 (1,y) 之间所有互质的数 x 范围 1 到 100000;
数论+容斥
先用欧拉函数求出 x 的素因子
考虑每一个x的因子的影响
#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL;
LL cot ;
LL a[1005];
void oula(LL n)
{
memset(a,0,sizeof(a));
cot = 0;
for(LL i = 2 ; i<=sqrt(n); i++)
{
if(!(n%i))
{
a[cot++] = i;
while(!(n%i))
{
n /= i;
}
}
}
if(n>1)
{
a[cot++]=n;
}
}
LL rongchi(LL n)
{
LL temp = 0;
for(LL i =1 ; i<(1<<cot); i++)
{
LL ans = 1;
LL ct =0 ;
for(LL j = 0 ; j<cot; j++)
{
if( i&(1<<j))
{
ct++;
ans = ans*a[j];
}
}
if(ct&1)
{
temp+= n/ans;
}
else
{
temp -= n/ans;
}
// printf("temp = %I64d\n",temp);
}
return n - temp ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL n,m;
scanf("%I64d%I64d",&m,&n);
if(m>n)
swap(m,n);
LL ans = 0;
if(m==1)
{
printf("%I64d\n",n);
continue;
}
for( LL i = 2; i<=m; i++)
{
oula(i);
LL k = rongchi(n);
// printf("K=%I64d\n",k);
ans+=k;
}
printf("%I64d\n",ans+n);
}
return 0 ;
}