ACM模版
描述

题解
tls 出的题,很强势。隐隐约约感觉知道点什么,就是理不清思路。
看了 tls 自己的题解后,吓得我赶紧翻了一下莫比乌斯函数,果然找到了这个有趣的规律。
贴一下 tls 的官方题解,很强,看他的题解有种看《具体数学》一般,懵逼了……
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = ;
int a, b;
int mul[MAXN];
int vis[MAXN];
int prime[MAXN];
// 素数筛
void getPrime()
{
memset(prime, , sizeof(prime));
for (int i = ; i <= MAXN; i++)
{
if (!prime[i])
{
prime[++prime[]] = i;
mul[i] = -;
}
for (int j = ; j <= prime[] && prime[j] <= MAXN / i; j++)
{
prime[prime[j] * i] = ;
if (i % prime[j] == )
{
break;
}
}
}
}
// mul
void init()
{
getPrime();
mul[] = ;
for (int i = ; * i <= MAXN; i++)
{
for (int j = ; j <= prime[] && prime[j] * i < MAXN; j++)
{
if (i % prime[j] == )
{
mul[prime[j] * i] = ;
break;
}
mul[prime[j] * i] = -mul[i];
}
}
}
ll F(int n)
{
if (n == )
{
return ;
}
ll ans = n;
for (int i = ; i * i <= n; i++)
{
ans -= mul[i] * (n / (i * i));
}
return ans;
}
ll S(int n)
{
ll ans = ;
int r, cnt = ;
for (int i = ; i < n && cnt; i += cnt)
{
r = n / i;
cnt = n / r - n / (r + );
ans += cnt * F(r);
}
return ans;
}
int main()
{
init();
cin >> a >> b;
cout << S(b) - S(a - ) << endl;
return ;
}