一名提高选手的数论之路(一)

2024-02-05 15:32
文章标签 数论 提高 一名 选手

本文主要是介绍一名提高选手的数论之路(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以后要写这个系列,一步步的学习数论^_^
1.首先是数论里用处非常大的快速幂:
(ksm如此基础的算法我就不多说了吧)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int b,p,m;
int ksm(){b%=m;//注意一点,一定要先取模再算,不取模很容易爆。int ans=1;while(p){if(p&1){ans=(ans*b)%m;}b=(b*b)%m;p>>=1;}return ans;
}
int main(){while(scanf("%d %d %d",&b,&p,&m)==3){printf("%d\n",ksm());}return 0;
}

2.然后应该是欧几里得和线性筛素数,我这里没有代码,我也不贴了。。
3.下来是扩展欧几里得算法,可以求二元一次方程最小解,具体自己看。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int exgcd(int a,int b,int &x,int &y){if(b==0){x=1;y=0;return a;}int q=exgcd(b,a%b,y,x);y-=a/b*x;return q;
}
int main(){int a,b,x,y;while(scanf("%d %d",&a,&b)==2){int q=exgcd(a,b,x,y);printf("%d %d %d\n",x,y,q);}return 0;
}

一道经典题目:同余方程
4.欧拉函数 O(x) 时间内求出:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int cnt=0;
int geteuler(int n){int ans=n;for(int i=2;i<=sqrt(n);i++){if(n%i==0){ans=ans/i*(i-1);while(n%i==0){n/=i;}}}if(n>1)ans=ans/n*(n-1);return ans; 
}
int main(){int n;while(scanf("%d",&n)==1){if(n==0)break;printf("%d\n",geteuler(n));}return 0;
}

5.下来是线性筛欧拉函数,自己搜吧:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=3000010;
int prime[maxn];
bool vis[maxn];
long long phi[maxn];
int cnt;
void getphi(){phi[1]=1;for(int i=2;i<maxn;i++){if(!vis[i]){prime[++cnt]=i;phi[i]=i-1;}for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){int k=i*prime[j];vis[k]=1;if(i%prime[j]==0){phi[k]=phi[i]*prime[j];break;}else phi[k]=phi[i]*(prime[j]-1);}}
}
int main(){int a,b;getphi();for(int i=1;i<=maxn;i++){phi[i]+=phi[i-1];}while(scanf("%d %d",&a,&b)==2){printf("%lld\n",phi[b]-phi[a-1]);}return 0;
}

6.下来是线性筛约数个数:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=10000000;
int prime[maxn];
int vis[maxn];
int e[maxn];
int num[maxn];
int cnt;
void getnum(){num[1]=1;for(int i=2;i<maxn;i++){if(!vis[i]){prime[++cnt]=i;e[i]=1;num[i]=2;}for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){int k=i*prime[j];vis[k]=1;if(i%prime[j]==0){num[k]=num[i]/(e[i]+1)*(e[i]+2);e[k]=e[i]+1;}else{num[k]=num[i]*num[prime[j]];e[k]=1;}}}
}
int main(){return 0;
}

第一篇就是这么多了,我还会继续更新的^_^

这篇关于一名提高选手的数论之路(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681359

相关文章

借助AI快速提高英语听力:如何获得适合自己的听力材料?

英语听力是英语学习中的一个重要组成部分,它对于提高语言理解和交流能力至关重要。可理解性学习(comprehensible input)是语言习得理论中的一个概念,由语言学家Stephen Krashen提出,指的是学习者在理解语言输入的同时,自然而然地习得语言。 Krashen认为,当学习者接触到稍微超出他们当前语言水平的输入时,他们会自然地习得语言。这个稍微超出的部分被称为“i+1”,其中“i

三、MyBatis实践:提高持久层数据处理效率

三、MyBatis实践:提高持久层数据处理效率 目录 一、Mybatis简介 1.1 简介1.2 持久层框架对比1.3 快速入门(基于Mybatis3方式) 二、MyBatis基本使用 2.1 向SQL语句传参 2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入 2.2.1 Mybatis总体机制概括2.2.2 概念说明2.2.3 单个简单类型

使用Rcpp提高性能之入门篇

C++能解决的瓶颈问题有: 由于迭代依赖于之前结果,循环难以简便的向量化运算递归函数,或者是需要对同一个函数运算成千上万次R语言缺少一些高级数据结构和算法 我们只需要在代码中写一部分C++代码来就可以处理上面这些问题。后续操作在Windows下进行,你需要安装Rtools,用install.packages("Rcpp")安装新版的Rcpp,最重要一点,你需要保证你R语言时不能是C:/Progr

如何提高Github的访问速度

最近总觉得Github的访问速度变慢了,导致我的工作效率也肉眼可见的降低了,主要体现在代码数量和质量的双重降低。 为了解决这一问题,我通过网络检索找到了一个非常好的工具,叫做dev-sidecar (https://github.com/docmirror/dev-sidecar), 这个工具的好处在于,图形化界面,完美解决了windows和MacOS上的问题,但是问题也出在图形化界面上,这意味

C语言编程:青年歌手参加歌曲大奖赛,有10个评委打分(满分10分),去掉最高最低分后,试编程求选手的平均得分

C语言编程:青年歌手参加歌曲大奖赛,有10个评委打分(满分10分),去掉最高最低分后,试编程求选手的平均得分: 代码如下: #include<stdio.h>void main(){int sum = 0,i;double avg,b;int a[10];int max,min;for(i=0;i<10;i++){scanf("%d",&a[i]);if(i==0)//只有第一次赋值m

python | rapidjson,一个实用的 提高JSON处理效率 Python 库!

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。 原文链接:rapidjson,一个实用的 Python 库! 大家好,今天为大家分享一个实用的 Python 库 - rapidjson。 Github地址:https://github.com/python-rapidjson/python-rapidjson 在现代应用程序开发中,JSON(JavaScript Obj

计算质数通过分区(Partition)提高Spark的运行性能

在Sortable公司,很多数据处理的工作都是使用Spark完成的。在使用Spark的过程中他们发现了一个能够提高Spark job性能的一个技巧,也就是修改数据的分区数,本文将举个例子并详细地介绍如何做到的。 查找质数   比如我们需要从2到2000000之间寻找所有的质数。我们很自然地会想到先找到所有的非质数,剩下的所有数字就是我们要找的质数。   我们首先遍历2到2000000之间的每个数

Android开发实用必备的几款插件,提高你的开发速度

1.GsonFormat 使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat,作用:速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。 2.ButterKnife Zelezny 又叫黄油刀 使用方法:Ctrl+Shift+B 作用:快速的绑定资源的id。和findViewbuId说再见。 3.Parcel

如何利用数据仓库进行业务分析:一名大数据工程师的视角

在大数据时代,数据的有效利用对企业的成功至关重要。 本文将基于上面的流程图,详细介绍如何利用数据仓库进行业务分析,并提供实际的例子和代码演示,以帮助读者更好地理解和应用相关技术。 数据仓库的基本流程 上图展示了一个典型的数据仓库流程,包括以下几个主要环节: 业务系统数据接入:业务系统等数据源将数据导入数据仓库。数据仓库建设:规划、建设数据仓库,包括数据模型设计和数据集成。数据分析需求获

【Rust日报】2021-05-13 -- Tracing Prism - 提高日志文件可读性的 Web 程序

Szyszka - 简单好用的批量文件重命名工具 Szyszka 使用 Rust 和 GTK3 创建,具有简单明了的 GUI ,适用于 Linux,Max,Windows。支持多种重命名规则:替换、清除、修改、自定义等。 Github: https://github.com/qarmin/szyszka Snap: https://snapcraft.io/szyszka Tracing Pr