The Euler function

      Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
      Total Submission(s): 4507    Accepted Submission(s): 1872
 
 
Problem Description
The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose you are given a, b, try to calculate (a)+ (a+1)+....+ (b)
 

Input

There are several test cases. Each line has two integers a, b (2<a<b<3000000).
 
Output
Output the result of (a)+ (a+1)+....+ (b)
 
Sample Input
3 100
 
Sample Outpu3042
 

题目大意:

给出n,m,你需要求出从n到m所有欧拉函数的值。

思路:

先看代码吧。。。。

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 3000010
using namespace std;
int n,m;
long long ans,phi[N];
void get_phi()
{
    phi[]=;
    ;i<=N;++i)
    {
        ) phi[i]=i;
        ;
    }
    phi[]+=phi[];
    ;i<=N;i+=)
    {
        if(phi[i]==i)
          for(int j=i;j<=N;j+=i)
            phi[j]=phi[j]/i*(i-);
        phi[i]+=phi[i-],phi[i+]+=phi[i];
    }
}
int main()
{
    get_phi();
    while(~scanf("%d%d",&n,&m))
    {
        ans=phi[m]-phi[n-];
        printf("%lld\n",ans);
    }
    ;
}

哈哈,看不明白对吧

显然,我也看不明白。。。。

好了,大体说说吧。 我们还是用欧拉函数来解这道题(废话(#‵′)凸)

但是我们显然不能直接暴力枚举(为什么??)(T成狗啊!!!!)可能您写的好看说不定就过了是吧(虽然不大可能吧。。。。因为有多组数据啊(无奈   )),反正我是T成狗了。。。。

既然这样不行,那我们就找个方便一点的做法。这是有的大佬就想到了,要不我们打个欧拉函数表吧(说白了就是打个表,用个数组把每个欧拉函数值都存起来)(蒟蒻头一回听说这个东西,长见识),不过好像还是T。。。。因为我们有多组数据,对于每一组数据我们都要o(n)查询

我们再找个方便一点的做法,要不我们用一个前缀和吧。(欸,好像可行。。。)这样我们就只需要处理一次,再对于每一组询问o(1)查询就好了

当然又有人要问了,怎么处理??    这个。。。。蒟蒻表示也不太懂,但我还是尽量说明白吧(若果有明显错误的地方,请不要听我瞎bibi)

首先我们先把数据处理到N(为什么?? 因为这样我们可以只处理一次,减小时间复杂度啊。 可是这样我们不就多处理了很多吗??那时间复杂度不是更高了吗??  ORZ,因为我们是有多组数据啊,我们不知道他最大的m是几啊,省得我们再对于每一组询问都要处理一次了),对于循环到的数,我们先判断她是奇数还是偶数,如果是偶数的话,那么就先把他的欧拉函数值附成i/2(为什么??  你看啊,2的欧拉函数值是不是1,4的欧拉函数值是不是2,6的欧拉函数值是不是2,8的欧拉函数值是不是4.。。。。。。这样是不是就可以推出n(为偶数)的欧拉函数值一定比n/2小  好吧,我们可以这样想,偶数一定与偶数不互质,那么我们就排除了n/2个数)如果是奇数的话我们就把他的欧拉函数值附成i,接下来我们再进行一遍循环,来筛掉与每个数不互质的数的个数。

  for(int i=3;i<=N;i+=2)//这个地方我们只循环奇数,因为对于偶数我们前面已经把与他一定不互质的数(偶数)排除了,那么如果
    {           //这个数还有与她不互质的数,那么这个最大公约数一定是奇数,不然一定早被筛掉了。。。。。
        if(phi[i]==i)//如果这个数没有被处理过
          for(int j=i;j<=N;j+=i)//跟欧拉筛一样是每个数都被他最小的因子所筛去
            phi[j]=phi[j]/i*(i-1);//欧拉函数公式
        phi[i]+=phi[i-1],phi[i+1]+=phi[i];//计算前缀和
    }

应该明白了吧。。。。

HDU——2824 The Euler function的更多相关文章

  1. hdu 2824 The Euler function(欧拉函数)

    题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...

  2. hdu 2824 The Euler function

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. hdu 2824 The Euler function 欧拉函数打表

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU 2824 The Euler function --------欧拉模板

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. HDU - 2824 The Euler function 欧拉函数筛 模板

    HDU - 2824 题意: 求[a,b]间的欧拉函数和.这道题卡内存,只能开一个数组. 思路: ϕ(n) = n * (p-1)/p * ... 可利用线性筛法求出所有ϕ(n) . #include ...

  6. hdu 2824 The Euler function(欧拉函数)

    如果打表的话会超内存,我想到了一种方法解决这个问题.题目给出的数据时3000000,我将三百万分成300个数据,将整万的数据存储下来,计算的时候,先计算x和y之间整万的数据,然后再计算零散数据. 想法 ...

  7. HDU——T 2824 The Euler function

    http://acm.hdu.edu.cn/showproblem.php?pid=2824 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  8. 欧拉函数 & 【POJ】2478 Farey Sequence & 【HDU】2824 The Euler function

    http://poj.org/problem?id=2478 http://acm.hdu.edu.cn/showproblem.php?pid=2824 欧拉函数模板裸题,有两种方法求出所有的欧拉函 ...

  9. HDU 2824.The Euler function-筛选法求欧拉函数

    欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2…pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛 ...

随机推荐

  1. TimeOut Error :因为远程服务器关闭导致mnist数据集不能通过input_data下载下来

    解决办法:  修改文件: C:\Users\501-PC\AppData\Local\Programs\Python\Python35\Lib\site-packages\tensorflow\con ...

  2. C#手机充值系统开发(基于聚合数据)

    说是手机充值系统有点装了,其实就是调用了聚合数据的支付接口,其实挺简单的事 但是我发现博客园竟然没有类似文章,我就个出头鸟把我的代码贡献出来吧 首先说准备工作: 去聚合数据申请账号-添加手机支付的认证 ...

  3. Java 创建Excel并逐行写入数据

    package com.xxx.common.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  4. leetcode377 Combination Sum IV

    思路: dp. 实现: class Solution { public: int combinationSum4(vector<int>& nums, int target) { ...

  5. Set,Map与Array,Object对比

    Map与Array 数据结构横向对比,用Map和Array分别实现最基本的增删改查: //增 { let theMap=new Map(); let theArray=[]; theMap.set(' ...

  6. C# 面向对象之类和方法

    一.新建一个类,用来存放属性和方法( 属性和方法写在同一个类中). 先新建一个类: using System; using System.Collections.Generic; using Syst ...

  7. ansible 批量推送ssh秘钥

    ansible 批量推送ssh秘钥 参考:http://docs.ansible.com/ansible/authorized_key_module.html # vi /etc/ansible/ho ...

  8. Redis系列(九)--几道面试题

    这里只是一点面试题,想了解更多,可以查看本人的Redis系列:https://www.cnblogs.com/huigelaile/category/1461895.html 1.Redis和Memc ...

  9. 03Microsoft SQL Server 数据类型

    Microsoft SQL Server 数据类型 数据类型 Number 类型: 数据类型 描述 存储 bit  允许0,1或NULL    tinyint 允许从 0 到 255 的所有数字. 1 ...

  10. [转载] Linux Futex的设计与实现

    Linux Futex的设计与实现 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正 ...