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 ;
}