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. }  
  • 相关阅读:
    Ubuntu 图形界面和终端切换
    docker 启动失败
    Windows 压缩文件到 Linux中解压文件名乱码
    PHP注释标记整理
    docker常用命令
    caffe初体验
    css中的单位
    js动态添加div
    Pycharm 2019 添加 docker 解释器
    常用的方法整理
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9866962.html
Copyright © 2011-2022 走看看