zoukankan      html  css  js  c++  java
  • 【UVA10820】交表

    题意

    输入n,求有多少个二元组(x,y)满足1<=x,y<=n,且x,y互质。

    600组数据,n不超过50001

    分析

    其实和这个题是一样的qvq

    x<y的二元组有f(n)个,那么答案就是2*f(n)+1

    根据欧拉函数的定义 f(n)=phi(2)+phi(3)+……+phi(n),把phi(1)=1补进去,就成了2*sum(n)-1,sum为∑phi

    这次就换一种求欧拉函数的方法吧,上次是利用欧拉函数的两个性质在线性筛里求的,维护前缀和

    第一种是时间复杂度O(N),第二种时间复杂度O(N×logN×logN)

    代码

    1. #include<bits/stdc++.h>  
    2. using namespace std;  
    3. #define N 50050  
    4. int n;  
    5. int phi[N],sum[N];  
    6.   
    7. inline void phis(int n)  
    8. {  
    9.     for(int i=2;i<=n;i++)  
    10.         if(!phi[i])  
    11.             for(int j=i;j<=n;j+=i)  
    12.             {  
    13.                 if(!phi[j])phi[j]=j;  
    14.                 phi[j]=phi[j]/i*(i-1);  
    15.             }     
    16.     for(int i=2;i<=n;i++)sum[i]=sum[i-1]+phi[i];  
    17. }  
    18.   
    19. int main()  
    20. {  
    21.     sum[1]=phi[1]=1;  
    22.     phis(50005);  
    23.     while(scanf("%d",&n)&&n)  
    24.         printf("%d ",2*sum[n]-1);    
    25. }  
  • 相关阅读:
    C#、.NET Framework、CLR的关系
    C# out和ref区别
    声明式事务管理
    SSH项目搭建后的简化
    SSH项目的搭建
    SSH的框架整合
    Swift
    如何下载String jar包
    SSH(struts2,spring4,hibernate5)详解
    SSH框架的简化(struts2、spring4、hibernate5)
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9866962.html
Copyright © 2011-2022 走看看