看了官方题解的最终结果
表示“通过容斥原理很容易可以得到F(n)。。。”那里没看懂。。不过这并不影响做题,毕竟公式都有了,套上就行了。看懂的路过的求讲一下。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 100000;
bool check[MAXN+10];
int prime[MAXN+10];
int mu[MAXN+10];
void Moblus()
{
memset(check,false,sizeof(check));
mu[1] = 1;
int tot = 0;
for(int i = 2; i <= MAXN; i++)
{
if( !check[i] )
{
prime[tot++] = i;
mu[i] = -1;
}
for(int j = 0; j < tot; j++)
{
if(i * prime[j] > MAXN) break;
check[i * prime[j]] = true;
if( i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else
{
mu[i * prime[j]] = -mu[i];
}
}
}
}
LL F(LL num)
{
int limit = sqrt(num);
LL ret = 0;
for(int i = 1; i <= limit; ++i)
ret += mu[i]*(num/(i*i));
return num-ret;
}
LL S(LL num)
{
int limit = sqrt(num);
LL res = 0;
LL r;
for(int i = 1; i <= num; i = r+1)
{
r = num/(num/i);
res += (r-i+1)*F(num/i);
}
return res;
}
int main()
{
Moblus();
int a,b;
scanf("%d %d",&a,&b);
printf("%I64d\n",S(b)-S(a-1));
return 0;
}