UVA

来源:互联网 发布:水滴桌面软件 编辑:程序博客网 时间:2024/06/08 08:45

题目链接:https://vjudge.net/problem/UVA-10820

解题思路:设左边的数比右边的数小,发现二元组的另一个元素与右边的数互质,那么就可以用欧拉函数处理

AC代码:

#include<cstdio>using namespace std;const int MAXN = 50000 + 5;bool vis[MAXN];int prime[MAXN], euler[MAXN], tot;void getPrime(){    tot = 0;    for (int i = 2;i < MAXN;i++)    {        if (!vis[i]) prime[tot++] = i;        for (int j = 0;j < tot&&i*prime[j] < MAXN;j++)        {            vis[i*prime[j]] = 1;            if (i%prime[j] == 0)                break;        }    }}void getEuler(){    for (int i = 0;i < MAXN;i++)        euler[i] = i;    for (int i = 0;i < tot;i++)    {        for (int j = prime[i];j < MAXN;j += prime[i])        {                   euler[j] /= prime[i];            euler[j] *= prime[i] - 1;        }    }}int main(){    getPrime();    getEuler();    for (int n;scanf("%d", &n) == 1 && n;)    {        int ans = 0;        for (int i = 2;i <= n;i++)            ans += euler[i];        ans *= 2;ans += 1;        printf("%d\n", ans);    }    return 0;}