uva 10820

欧拉函数。。。。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=50000+10;
int pp[maxn];
int sum[maxn];
int n;
void ola()
{
    memset(pp,0,sizeof(pp));
    memset(sum,0,sizeof(sum));
    pp[1]=1;
    for(int i=2;i<=maxn;i++)
        if(!pp[i])
        {
            for(int j=i;j<=maxn;j+=i)
            {
                if(!pp[j]) pp[j]=j;
                pp[j]=pp[j]/i*(i-1);
            }
        }
        for(int i=1;i<=maxn;i++)
            sum[i]=pp[i]+sum[i-1];
}
int main()
{   ola();
    while(~scanf("%d",&n)&&n!=0)
    {
        printf("%d\n",sum[n]*2-1);
    }
    return 0;
}
时间: 2024-10-22 14:40:11

uva 10820的相关文章

UVA - 10820欧拉函数的应用

这是一道很基础的欧拉函数的题目 题意要求  (x,y) 互质 &&x<=n&&y<=n 求互质对数 可以运用容斥,求出 phi(n)=n(1-1/n1)(1-1/n2)......(1-1/nk); 因为(2,4) (4,2) 算两对,所以 答案为 2*f(n)+1; #include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream>

UVa 10820 (打表、欧拉函数) Send a Table

题意: 题目背景略去,将这道题很容易转化为,给出n求,n以内的有序数对(x, y)互素的对数. 分析: 问题还可以继续转化. 根据对称性,我们可以假设x<y,当x=y时,满足条件的只有(1, 1). 设f(n)为 集合S{(x, y) | x<y且x.y互素} 的个数,则所求答案为2f(n)+1 f(n)表达式为: ,其中φ(n)为欧拉函数 这里有欧拉函数的一些介绍 1 #include <cstdio> 2 3 const int maxn = 50000; 4 5 int ph

UVA 10820 交表

#include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<vector> #include<stdlib.h> #define maxn 50000 #include<algorithm&g

Uva 10820 Send a Table(欧拉函数)

对每个n,答案就是(phi[2]+phi[3]+...+phi[n])*2+1,简单的欧拉函数应用. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<list> #i

UVA 10820 Send a Table 数论 欧拉函数

题目链接: https://vjudge.net/problem/UVA-10820 题目描述: 给你一个N, N <= 50000, 让你寻找N之内互素数的个数 解题思路: 欧拉函数, 由于位置颠倒是两个解, 在小于N的范围内只有(1, 1)x, y相等, 其他的都是不等的, 所以我们只需要算phi(2) + phi(3) + ...... phi(n), 然后 * 2 + 1即可 代码: #include <iostream> #include <cstdio> #inc

UVA 10820 Send a Table

https://vjudge.net/problem/UVA-10820 题意: 有一张表 f[x][y],共x*y个数 现在要删去所有的 f[x*k][y*k] ,k>1 最后还剩多少个数 题意转化:有多少个二元组(x,y)满足 gcd(x,y)=1 若x<y,则 f[][y]=phi(y) 所以 ans= (2* Σ phi(y))+1   y∈[2,n] 加的1为(1,1) 线性筛出欧拉函数求和即可 #include<cstdio> #define N 50001 using

UVA 10820 Send a Table euler_phi功能

除1,1其他外国x,y不等于 为 x<y 案件 一切y有phi(y)组合 F[x]= phi(i) 2<=i<=x 结果为 2*F[x]+1 Problem A Send a Table Input: Standard Input Output: Standard Output When participating in programming contests, you sometimes face the following problem: You know how to calc

D - Send a Table (UVA - 10820)

- 题目大意 给出一个n,求从1~n中任意两个数互质的对数为多少,(a,b)和(b,a)算两对. - 解题思路 构造一个欧拉函数的方法,然后用一个数组去存储下标,因为(a,b)和(b,a)算两对,所以每一个都加两倍,但(1,1)很特殊,所以最后减一就行了. - 代码 #include<iostream> #include<cmath> #include<cstring> using namespace std; const int MAX = 600000; int p

POJ 3090 (欧拉函数) Visible Lattice Points

题意: UVa 10820 这两个题是同一道题目,只是公式有点区别. 给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 对于点(x, y), 若g = gcd(x, y) > 1,则该点必被点(x/g, y/g)所挡住. 因此所见点除了(1, 0)和(0, 1)满足横纵坐标互素. 最终答案为,其中的+3对应(1, 1) (1, 0) (0, 1)三个点 1 #include <cstdio> 2 3 const int maxn = 1000; 4 int