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