UVA11426 FZU1969 51NOD1188 线性欧拉筛法+筛法

线性筛法(欧拉筛)有关 关于筛法 埃筛(Eratosthenes筛法)人人都会 思想就是质数的倍数一定不是质数 埃筛瓶颈在于时间是O(nlog22n)O(nlog22n)O(nlog^2_2n),数据太大会TLE 怎么办呢? 欧拉筛(线性筛法) 线性筛可以做到O(n)O(n)O(n) 思考筛到当前第iii个数,第jjj个质数 不像埃筛,如果p[j]|ip[j]|ip[j]|i就直接breakbr... 阅读详情

题目大意:

计算:

G=∑i<Ni=1∑j<=Nj=i+1GCD(i,j)


难度系数(往下递增):

  • UVA11426
  • FZU1969
  • 51NOD1188

题目思路一:

G=∑ng=1g(∑phi(⌊gd⌋−1)

求这么个东西,我们先预处理欧拉函数,然后枚举公约数g。
显然对于⌊gd⌋我们可以分块求。

时间复杂度:

O(T*sqrt(n))

题目思路二:

因为51NOD,其样例数过多,那么我们就要想一种更快的办法。现在我们需要枚举公约数g,计算一下他们对其的倍数的贡献。然后在nlogn的时间里预处理出res[i](答案数组)。

伪代码:

    for(int g=1;g<maxn/2;g++) 
        for(int i=g+g;i<maxn;i+=g) 
            res[i]+=(LL)g*phi[i/g];

时间复杂度:

O(nlogn+T)
( Orz 恩,这个做法感觉合理多了呢? )

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=5e6+5;
int phi[maxn],prime[maxn],primesize;
LL res[maxn];
bool isprime[maxn];
const int read()  
{  
    char ch = getchar();  
    while (ch<'0' || ch>'9') ch = getchar();  
    int x = ch - '0';  
    while ((ch = getchar()) >= '0'&&ch <= '9') x = x * 10 + ch - '0';  
    return x;  
}  
template <class T>
inline void print_d(T x)
{
    if (x > 9)
    {
        print_d(x / 10);
    }
    putchar(x % 10 + '0');
}
int main()
{
    for(int i=2;i<maxn;i++)
    {
        if(!isprime[i])
        {
             prime[++primesize]=i;
             phi[i]=i-1;
         }
         for(int j=1;j<=primesize&&i*prime[j]<maxn;j++)
         {
            isprime[i*prime[j]]=true;
            if(i%prime[j]==0)
             {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
    for(int g=1;g<maxn/2;g++) for(int i=g+g;i<maxn;i+=g) res[i]+=(LL)g*phi[i/g];
    res[0]=0;
    for(int i=1;i<maxn;i++) res[i]+=res[i-1];
    int n,T;
    T=read();
    while(T--) 
    {
        n=read();
        print_d(res[n]);
        putchar('\n');
    }
}
线性筛法(欧拉筛) 从前有一个素数筛法叫埃拉托斯特尼筛法,它的思想很简单,把1-n以内素数的整数倍的数字划掉,留下的就全是素数,但是它的复杂度是O(NlglgN),对于大量不友好数据会跪,于是线性晒登场了。 #include using namespace std; int prime[1100000],primesize,phi[11000000]; bool isprime[11000000]; void g 阅读详情

相关推荐

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4288

素数的筛选——线性(欧拉)筛法

的倍数,在完成了一次去除后剩下的最小的数字就是一个素数,又可以从它开始去除它的倍数的数字了,这样一直到。(是素数或者是被去除的数)为止。因为某个数总是素数的乘积,所以合数都会被去除。以内的素数,一般有两种方法,一个是埃氏筛法,另一个是欧拉筛法。,欧拉筛法的时间复杂度为 线性阶的,因而它又被称为线性筛法。不过这种算法时间复杂度为。(2)在上述筛法中,对于。矛盾,因此不存在这样的。

weixin_56870809的博客 6076

运算放大器基础1——用作比较器

运算放大器,运放,在电路设计中非常常见。在图2中,当前状态下,开关切换到0V,“正相输入”和“负相输入”都是接地,运放两个输入端电压相同。最后,调节可变电阻,使其两端电压大于3.37V,比如3.43V,作为运放正相输入,由于电压大于反相输入,LED点亮(运放输出为5V)。其次,调节可变电阻,使其两端电压小于3.37V,比如2.09V,作为运放正相输入,由于电压小于反相输入,LED不点亮。好,现在我们将0.1V电源换个方向,这样实际“正相输入”的是-0.1V,比“负相输入”的电压要低,看看输出是什么?

m0_60069998的博客 6123

欧拉筛(线性筛)算法的理解

本文章主要介绍了欧拉筛算法的一些相关知识理解和过程。欧拉筛(Euler's Sieve)(又叫线性筛)是一种用于生成素数的高效算法。使用完欧拉筛后,n范围内的所有素数都会存放到prime表中,如果要输出n范围内所有的素数,则把prime表中的所有内容输出即可。

weixin_47257473的博客 4877

双轮差动机器人SLAM实战:轮速里程计从建模到精度验证(附Matlab代码)

本文详细介绍了双轮差动机器人SLAM系统中轮速里程计的实现全流程,包括核心原理、建模方法、Matlab代码实现及精度验证。通过轮速仪数据建模和连续积分算法,提升定位精度,并附有完整的误差分析和工程优化技巧,为开发者提供实用参考。

weixin_29050271的博客 224

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

线性筛(欧拉筛)

尽管欧拉并没有发明这个算法,但他的名字被用来命名这种算法,以纪念他对素数研究的贡献。线性筛的原理是基于每个合数在其质因数分解中,每个质因数都是该合数的最小质因数,这样确保了每个数只被筛选一次,避免了重复操作,从而实现了线性的时间复杂度。这种算法不仅用于筛选素数,还可以用于筛选其他数学函数,如。,是一种用于筛选素数的高效算法,其时间复杂度近似于O(n)O(n)。这种算法的优点在于每个数只被筛选一次,即“这个合数只会被它的最大非自身因数(对应最小质因数)筛”。线性筛的时间复杂度为O(n)。

m0_67249626的博客 1349

Simulink仿真入门到精通(三) Simulink信号

本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。 目录 Simulink仿真入门到精通(一) Simulink界面介绍 Simulink仿真入门到精通(二) Simulink模块 Simulink仿真入门到精通(三) Simulink信号 Simulink仿真入门到精通(四) Simulink子系统 Simulink仿真入门到精通(五) Simulink模型的仿真 Simulink仿真入门到精通(六) Simulink模型保存为图片 Sim

king110108的专栏 5396

欧拉筛法简介

欧拉筛法,也称为线性筛法,主要用于在1到n的范围内筛选出所有的质数。其核心思想是确保每个合数只被其最小的质因子筛掉一次,从而避免了重复筛选,提高了算法的效率。欧拉筛法的时间复杂度接近O(n),是一种非常高效的质数筛选算法。欧拉筛法是一种高效的质数筛选算法,通过避免重复筛选提高了算法的效率。其核心思想是确保每个合数只被其最小的质因子筛掉一次。算法步骤简单明了,时间复杂度接近O(n),在实际应用中具有广泛的应用前景。通过深入理解和熟练掌握欧拉筛法,可以更好地解决数论及相关领域中的问题。

bz02_2023f2的博客 2521

高通平台WIFI学习-- 基于6GHZ Discovery (STA Scanning)讲解

本文介绍了6GHz频段的网络扫描优化方案。主要内容包括:1)带内发现机制,将6GHz信道分为优先扫描信道(PSC)和非PSC信道,规范了STA发送探测请求的条件及等待时间;2)带外发现机制,通过RNR信息元素实现跨频段AP发现,减少6GHz频段干扰;3)具体扫描流程示例,包括DBS扫描和敏捷扫描的顺序安排。方案通过优化探测请求发送规则和跨频段信息共享,有效降低了信道污染和扫描延迟,日志数据验证了6GHz信道扫描的具体实现过程。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 267

蓝牙EDR模式中GFSK调制如何过渡到DPSK调制

这两份文档片段揭示了蓝牙Modem设计中非常精深的部分。它的核心思想是:通过精心的脉冲形状设计和重叠,来保证幅度连续;通过在保护间隔内执行一套复杂的“相位平滑算法”(重复、斜率保持、寻找基准点、冻结),来保证相位连续。Figure 3-2 则是将这个思想用图形化的方式展现出来,说明了脉冲在时间轴上的对齐和叠加关系。这种设计确保了发射机能够严格符合蓝牙规范的要求,实现不同调制方式之间的平滑、无毛刺切换,从而保障了通信的可靠性和高效的频谱利用率。

m0_49540263的博客 283

线性—欧拉筛

例如,当 i=4 时, primes[j]=2 ,若继续用 primes[j]+1=3 相乘得到 12 ,但 12 的最小质因子是2,应在 i=6 时由 2*6 筛除。而欧拉筛(又称线性筛)通过确保每个合数仅被其最小质因子筛除一次,将时间复杂度优化至 O(n),成为解决大规模素数筛选问题的利器。- 合数12的最小质因子是2,因此它只会在外层循环遍历到6(即 6*2 = 12)时被筛除。双重循环的作用:外层遍历每个数,内层用已知素数筛选合数,确保每个合数仅被标记一次。

2401_87718549的博客 567

Microsemi Libero系列教程(二)——新建点灯工程

前言 上一篇文章,介绍了Microsemi Libero系列教程(一)-Libero开发环境介绍,下载,安装与注册,作为嵌入式开发中的Hello World,点灯是再也基础不过的实验了,通过点灯实验,可以了解芯片GPIO的控制和开发环境IDE新建工程的流程,对于FPGA来说,每个IO口几乎一样,所以本篇文章主要学习一下如何基于Microsemi Libero集成开发环境建立一个示例工程,让一个L...

whik1194的博客 1万+

欧拉筛-质数筛的神c++

欧拉筛(Euler's Sieve),又称线性筛法或欧拉线性筛,是一种高效筛选素数的方法。其核心思想是从小到大遍历每个数,同时标记其倍数为合数,但每个合数只被其最小的质因数标记一次,从而避免了重复标记,实现了线性时间复杂度的素数筛选。

szm111213的博客 2439

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

线性筛素数and欧拉函数

好久没打博客了。。。。_ (:зゝ∠) _,毕竟狗出竞赛。。。最近题目都涉及到素数的问题,发现自己连个线筛都不会,赶紧去看了一波。虽说一下子就看懂了。正题一般遇到个数,要判断是否为素数。 这从刚学时就开始了。。。。方法一:从2~n-1枚举,看是否有一个i使得n%i==0,没有即为素数。 时间O(n)最蠢的方法二:从2~sqrt(n)里枚举。因为若存在一个大于sqrt(n)的数能整除n,n/sqr

Last_Freezen_yue的博客 525

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线性筛(欧拉筛)——算法解析

基本介绍:欧拉筛是一个能够做到O(n)的时间复杂度的质数筛法。是目前最优秀的质数筛法,一个十分基础的工具,从原理上掌握它是非常有必要的。 原理分析: 核心代码就在这里: for(ll i=2;i<=Max;i++) { for(ll j=1;j<=count1 && i*prime[j]<=Max;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) break; } } prime中素数是递增的,当i%

风中的微尘的博客 5096

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

欧拉筛法(线性筛)的学习理解

前言 在刚接触编程语言时,对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期。在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛法,也即 O(n)的线性筛法。 埃氏筛法 埃氏筛法的基本思想 :从2开始,将每个质数的倍数都...

彤云望月 8万+

线性筛法(欧拉筛法)

嗯在刚刚(没错就是在几分钟之前!

wuzhuangtai00的专栏 1289

51NOD 1188 数学

简略题意:求∑n−1i=1∑nj=i+1gcd(i,j)\sum_{i = 1}^{n - 1}\sum_{j=i+1}^{n} gcd(i, j)。∑n−1i=1∑nj=i+1gcd(i,j)\sum_{i = 1}^{n - 1} \sum_{j=i+1}^{n} gcd(i, j) =∑ni=1∑i−1j=1gcd(i,j)= \sum_{i = 1}^{n}\sum_{j = 1}^{i

即使摸爬滚打,满身泥泞,我也要前进 322

51Nod-1188-最大公约数之和 V2

ACM模版描述题解题目要求所有小于等于 NN 的两两之间的最大公约数的和,如果我们直接这么考虑两者之间的关系其实并不好想,我们可以先固定一个来考虑。如果我们求 [1,n][1, n] 与 mm 的 GCDGCD 的和是多少呢?设 GCD(m,i)==xGCD(m, i) == x,那么我们很容易就能得到 GCD(m/x,i/x)==1GCD(m/x, i/x) == 1,所以顺理成章可以确定的是,这

逐梦者 694

51 NOD 1188 最大公约数之和 V2(基础数论)

数学 推导公式 欧拉筛法

代码改变世界 1819

[51nod1188]最大公约数之和 V2

Description求∑i=1n−1∑j=i+1ngcd(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i,j) n<=5*10^6,数据组数<=50000Solution一眼看到莫比乌斯反演(感觉中毒了) 但是会超时!!! 想想其他方法。 我们知道,如果要在区间[1..i]中询问gcd(i,x)=t的个数。那么也就相当于询问gcd(i/t,x/t)=1的

时光真疯狂, 我一路执迷于匆忙. 1416

51Nod-1969-Fire!

ACM模版描述题解数论题,直接调用结论……要是想知道怎么证明,建议去看看那本叫做《初等数论及其应用》第七章部分讲有详细的推论与证明。至于结论嘛,在题解中说的十分清楚了,贴出来大家看看吧……最讨厌这种题了……对我这样的数学渣滓来说,要命的。P.s. 这尼玛都是神马玩意儿啊……代码#include <iostream> #include <cstdio> #include <cmath>using na

逐梦者 398

数论——51nod1188 最大公约数之和 V2

题面:51nod1188 emmm就是前一道题的升级版了。。。 首先建议去看一下我的前一篇题解:传送门。前一篇题解(就是“最大公约数之和”)是这篇题解的基础 首先一维变成了两维,我们还是可以按照原来的思路来做。 上一篇讲到求∑ni=1gcd(i,n)我们转成了∑nx|nphi(n/x)∗x,这题继续用 本题要求∑ni=1∑i−1j=1gcd(i,j),那我们可以先转成∑ni=1∑i−1x|iphi(i/x)

2333:jzqjzq的博客专栏 487

线性筛(欧拉筛)

欧拉筛 1:关于欧拉筛 用途:线性的求区间[1,n]的所有质数 事实上,优化以后的埃氏筛已经很优秀了,一般情况下,很难通过时间复杂度区分欧拉筛和埃氏筛。 所以我们为什么需要欧拉筛 欧拉筛可以完成很多计数,比如欧拉函数 欧拉筛比较高级且常数略小一些 2:原理和过程 过程: 欧拉筛的主要思想是,用已知的质数筛掉这个质数的倍数。且需要保证对于任意一个合数,它会且只会它的最小因数筛掉 所以我们只需要枚举i = 2~n(主意1不是质数)在这个过程中维护已经发现的所有质数的集合。然后筛掉这些质数的i倍。一旦发现某个

RedForest!!! 1418

[欧拉函数]51nod 1188 最大公约数之和 V2 题解

(传送门)题目大意求∑n−1i=1∑nj=i+1\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}解题分析同V1一样的分析,但这题多组数据。而且求前n,所以可以从前缀和的思想入手。而且需要用欧拉筛来求解。读优别落下。lrj蓝书原题……到51nod上就贼坑,而且书上代码还挂了。 可以枚举因子,然后用它的倍数更新。时间复杂度与普通筛法同阶。什么意思?A这道题需要人品啊。复杂度: 时间:

Wflower的Blog //What are you waiting for? 367
上一篇: hdu5618Jam's problem again (CDQ分治)
下一篇: C++面试题汇总
overload1997
博客等级 码龄11年 328粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值