前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法模板——线性欧拉函数

算法模板——线性欧拉函数

作者头像
HansBug
发布于 2018-04-11 02:48:00
发布于 2018-04-11 02:48:00
56100
代码可运行
举报
文章被收录于专栏:HansBug's LabHansBug's Lab
运行总次数:0
代码可运行

实现功能:求出1-N的欧拉函数,然后应对若干个询问操作

其实就是个素数判定+欧拉函数性质的二合一

代码如下,我觉得应高不难懂,只要你知道欧拉函数的性质

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var
   i,j,k,l,m,n:longint;
   a,b:array[0..10000005] of longint;
procedure phi;
          var i,j:longint;
          begin
               m:=0;a[1]:=1;
               for i:=2 to n do
                   begin
                        if a[i]=0 then
                           begin
                                inc(m);
                                b[m]:=i;
                                a[i]:=i-1;
                           end;
                        for j:=1 to m do
                            begin
                                 if (i*b[j])>n then break;
                                 if (i mod b[j])=0 then
                                    a[i*b[j]]:=a[i]*b[j]
                                 else
                                     a[i*b[j]]:=a[i]*(b[j]-1);
                            end
                   end;
          end;
begin
     readln(n);phi;
     while true do
           begin
                readln(j);
                writeln(a[j]);
           end;
end.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-05-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2818: Gcd
2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2170  Solved: 979 [Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,2) 1<
HansBug
2018/04/11
4800
算法模板——单个值欧拉函数
输入N,输出phi(N) 这样的单个值欧拉函数程序一般见于部分数论题,以及有时候求逆元且取模的数不是质数的情况(逆元:A/B=A*Bphi(p)-1 (mod p),一般常见题中p是质数,phi(p)-1=p-2) (Tip:我是来水经验的不解释,不过话说真的好久没写这个了TT) 1 var i:int64; 2 function Eula(x:int64):int64; 3 var res:int64;i:longint; 4 begin 5
HansBug
2018/04/10
6380
算法模板——线性筛素数
实现功能:如题,筛出1——N内的所有素数 原理:如phile神犇所言,这次的才算是真正意义上的线性筛素数,其精髓在于if (i mod a[j])=0 then break; 因为——如果眼下的a[j]已经是i的因数了,则意味着即使再进行b[i*a[j]]:=1,那么I*b[j]也必然会被其他的数以同样的操作覆盖到,所以可以退出了,这个算法的思想在于减少重复劳动(鸣谢qcgrxx神犇,源链接) 1 var 2 i,j,k,l,m,n:longint; 3 a,b:array[0..1000
HansBug
2018/04/11
5710
算法模板——LCA(最近公共祖先)
实现的功能如下——在一个N个点的无环图中,共有N-1条边,M个访问中每次询问两个点的距离 原理——既然N个点,N-1条边,则说明这是一棵树,而且联通。所以以1为根节点DFS建树,然后通过求两点的LCA的方式,先求得最近公共祖先,然后再通过深度来求出两点距离 1 type 2 point=^node; 3 node=record 4 g:longint; 5 next:point; 6 end; 7
HansBug
2018/04/10
1.1K0
算法模板——Dinic最小费用最大流
实现功能:输入M,N,S,T;接下来M行输入M条弧的信息(包括起点,终点,流量,单位费用);实现功能是求出以S为源点,T为汇点的网络最大流的最小费用 其实相当的像Dinic最大流呐= = 还是spfa处理出最短路径(注意,这次是最短路径,所以时空复杂度将有所提高,害得我都开循环队列了TT),然后顺着最短路径顺藤摸瓜找回去,求出流大小和最小的费用,然后,没有然后了,程序还是一样的好懂么么哒(HansBug:感觉Dinic算法真心超级喜感,为啥我之前就没发现呢= =,还有鸣谢wnjxyk神犇提供的C++模板么么
HansBug
2018/04/11
2.4K0
算法模板——计算几何2(二维凸包——Andrew算法)
实现功能:求出二维平面内一对散点的凸包(详见Codevs 1298) 很神奇的算法——先将各个点按坐标排序,然后像我们所知的那样一路左转,求出半边的凸包,然后反过来求另一半的凸包 我以前正是因为总抱着想一步到位的想法,所以每次都跪得很惨(HansBug:事实上这次是我这辈子第一次A掉凸包题) 然后别的没了,就是凸包的基本思想 (顺便输出凸包周长C和面积S) 1 type arr=array[0..100005] of longint; 2 var 3 i,j,k,l,m,n,m1,m2:long
HansBug
2018/04/11
5700
算法模板——线段树2(区间加+区间乘+区间求和)
该模板实现的功能——进行区间的乘法和加法,以及区间的求和(1:乘法 2:加法 3:求和)详见BZOJ1798 1 type 2 vet=record 3 a0,a1:int64; 4 end; 5 var 6 i,j,k,l,m,n,a2,a3,a4:longint; 7 p:int64; 8 d1,d2,d:vet; 9 a,c:array[0..1000000] of int64; 10 b:
HansBug
2018/04/10
9580
算法模板——计算几何1(图形面积)
实现功能——输入N个点,求出按此顺序围成的图形的面积 原理:其实就是个向量的叉积运算(详见UASCO-nocow:计算几何),注意二维的叉积是个很逗的东西,叉积这玩意本身就来自于三维向量 (HansBug:临睡觉了,水一发呵呵哒,额。。。phile犇不在好寂寞TT) 1 var 2 i,j,k,l,m,n:longint; 3 a:array[0..100000,1..2] of longint; 4 function surface:extended;inline; 5
HansBug
2018/04/10
7010
算法模板——平衡树Treap
实现功能如下——1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的数) 本程序的实现原理为Treap平衡树 详见BZOJ3224 1 var 2 i,j,k,l,m,n,head,ts:longint;f1:text; 3 a,b,fix,lef,rig:array[0..500000] of
HansBug
2018/04/10
6590
算法模板——splay区间反转 2
实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没有像一般二叉排序树那样子用一个参量进行排序,而是直接以中序遍历来构建了一个普通的二叉树(当然也可以把每个点的中序遍历排名视作参量),然后插入的时候就是指定位置插入(这个就比较像是文本插入了) 总之得到了较大的提升,代码优美程度也提高不少 1 var 2 i,j,k,l,m,n,head,tot,l
HansBug
2018/04/11
6640
算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有向图可以有效的进行缩点(每个强连通分量缩成一个点),构成一个新的拓扑图(如BZOJ上Apio2009的那个ATM)(PS:注意考虑有些图中不能通过任意一个单独的点到达全部节点,所以不要以为直接tarjan(1)就了事了,还要来个for循环,不过实际上复杂度还是O(M),因为遍历过程中事实上每个边还是只会被走一次
HansBug
2018/04/10
6400
从Hash Killer I、II、III论字符串哈希
首先,Hash Killer I、II、III是BZOJ上面三道很经典的字符串哈希破解题。当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机水过去,遂恍然大悟。。。 于是,本人今天也做了下实验——假设现在有一个字符串题:输入N,接下来N行输入N个长度一样的由大写字母组成的字符串,求一共有多少种不同的字符串。此题有些类似于Hash Killer上面的原题。首先分析此题本身,两种常规办法:1.建立一棵字典树,然后可以相当方便快捷的判重,对于字符串长度均
HansBug
2018/04/10
9630
算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣谢,然后,贴模板走人 1 var 2 i,j,k,l,m,n,head,tot:longint; 3 a,b,lef,rig,fix:array[0..100010] of longint; 4 function min(x,y:longint):longint; 5
HansBug
2018/04/11
5240
算法模板——左偏树(可并堆)
实现的功能——输入1 x,将x加入小根堆中;输入2,输出最小值并去在堆中除掉 实现原理——左偏树,这里面维护的是一个小根堆,个人认为其还是没有发挥出左偏树的真正威力——其真正威力在于堆与堆之间可以直接合并,而且复杂度仅为O(logN),在零散插入元素时可以采用本程序中一个个加入的方法,但是当有些题目中预处理多个元素时,则建议通过队列进行合并(别忘了堆与堆之间可以直接合并哦~~~),这样子快一点(详见:《左偏树的特点及其应用》By黄源河),代码量嘛,估计是这几棵常用树里面最短的了,都快和最小生成树差不多了,甚
HansBug
2018/04/10
8210
欧拉函数
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中 p1, p2……pn 为 x 的所有质因数,x 是不为 0 的整数 φ(1)=1(唯一和 1 互质的数就是 1 本身)【注意:每种质因数只一个。比如 12=223】
Cell
2022/02/25
4690
欧拉函数
算法模板——Dinic网络最大流 2
实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法。。。 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流也采用这种模式,这样子有效避免的递归,防止了爆栈么么哒 1 type 2 point=^node; 3 node=record 4 g,w:longint; 5 next,anti:point; 6 end; 7
HansBug
2018/04/11
7990
算法模板——Trie树
实现功能——实现对于不同字符串以及之前出现过的字符串的识别,对于单个长度为L的字符串,复杂度为O(L); 代码不难懂,直接上(在识别字符串方面,个人觉得其好处远远大于hash识别——1.理论上都是O(L) 2.哈希弄不好撞车撞一大串,尤其是哈希策略不太好的时候,而这个绝对不可能撞,严格的O(L) 3.这个代码真心短,一点也不比hash长,只要你链表还会用) 1 type 2 pp=^nod; 3 nod=record 4 ex:longint; 5
HansBug
2018/04/10
5160
算法模板——哈希单模板字符串匹配
实现功能:第一行输入模板串;第二行输入N;接下来N行每行一个字符串,将每个字符串中出现的模板串的起始位置找出 原理:字符串双值哈希啦啦啦,和KMP其实差不太多,但是字符串双值哈希绝对是个字符串题乱搞神器!!! 1 const pa=314159;pb=951413; 2 var 3 i,j,k,l,m,n:longint; 4 ap,bp:array[0..100000] of int64; 5 ma,mb,va,vb:int64; 6 s1,s2,s3:ansistri
HansBug
2018/04/10
1.1K0
算法模板——线段树5(区间开根+区间求和)
实现功能——1:区间开根;2:区间求和(此模板以BZOJ3038为例) 作为一个非常规的线段树操作,其tag也比较特殊呵呵哒 1 var 2 i,j,k,l,m,n:longint; 3 a,b:array[0..500000] of int64; 4 function max(x,y:longint):longint;inline; 5 begin 6 if x>y then max:=x else max:=y; 7
HansBug
2018/04/10
8370
2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 1737  Solved: 749 [Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。 Input 第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k Outp
HansBug
2018/04/11
6110
相关推荐
2818: Gcd
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验