题意:
求Fi集合中元素的个数,其中Fi集合的元素满足下列条件:形如a/b,且0<a<b<=i, gcd(a,b)=1,最后求个前缀和
要点:
就是欧拉函数的基本运用,不过用类似线性筛的方式写。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6+50;
int num[maxn];
ll s[maxn];
void init()
{
memset(num, 0, sizeof(num));
for (int i = 2; i < maxn; i++)
{
if(!num[i])//num不为0说明之前已经筛过,比如15之前已经3,5分别筛过一次,肯定就不能作为分子了
{
for (int j = i; j < maxn; j += i)//类似线性筛
{
if (!num[j])
num[j] = j;
num[j] = num[j] / i*(i - 1);
}
}
s[i] = s[i - 1] + num[i];
}
}
int main()
{
int n;
init();
/*for (int i = 2; i <= 100; i++)
printf("%d\n", s[i]);*/
while (scanf("%d", &n) != EOF&&n)
{
printf("%I64d\n", s[n]);
}
return 0;
}