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 namespace std;
bool v[N];
int phi[N],cnt,p[N];
int main()
{
    for(int i=2;i<N;i++)
    {
        if(!v[i]) p[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt;j++)
        {
            if(p[j]*i>=N) break;
            v[i*p[j]]=true;
            if(i%p[j]) phi[i*p[j]]=(p[j]-1)*phi[i];
            else
            {
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
        }
    }
    for(int i=2;i<N;i++) phi[i]+=phi[i-1];
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) return 0;
        printf("%d\n",1+phi[n]*2);
    }
}
时间: 2024-08-09 10:39:04

UVA 10820 Send a Table的相关文章

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

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

题意: 题目背景略去,将这道题很容易转化为,给出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

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

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

UVA10820 send a table

题意:对(x,y),1<=x,y<=n 求出有多少对(x,y)互质 题解:筛法跑一遍欧拉就好了 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; ll phi[50001]; void init() { for(int i=1;i<=50000;i++

uva10820 send a table (nlogn求1-n欧拉函数值模版

//重点就是求1-n的欧拉函数啦,重点是nlogn求法的版 //大概过程类似于筛选法求素数 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<queue> 8 #include<vector> 9 #i

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>