数论

洛谷网校:数论(一)

£可爱£侵袭症+ 提交于 2020-01-29 21:36:19
2020.1.29 数论(一) 1.引入 一开头讲了整除,质数,合数,质因数分解,带余除法,两数同余等小学基础知识,不加赘述。 有关推论: 1.约数总是成对出现 若 k 是 n 的约数, 则 (n/k) 也是 n 的约数。 在一对约数中,必有一个不大于 √ n,另一个不小于 √ n。 因此枚举 1..√ n 就能求出 n 的所有约数。 2.整除的表示 a|b表示:b%a=0 3.同余的表示 a ≡ b(mod c) 与 c|(a − b) 等价,表示:a%c=b%c 2.最大公约数 gcd(a,b)=gcd(a,a+b)=gcd(a,ka+b) gcd(ka,kb) = k·gcd(a,b) gcd(a,b,c)=gcd(gcd(a,b),c) 3.欧几里得算法(辗转相除法) a>=b的前提下 由gcd(a,b)=gcd(a,ka+b)推得:gcd(a,b)=gcd(b,a%b)(k为a/b(整除)的相反数) 所以每次较大数都减少至少一半(取模运算,易证) 所以时间复杂度为O(log~2~n) 4.裴蜀定理 若d=gcd(a,b),则对任意整数x,y有d|(ax + by)成立(理所当然地成立) 且一定有x,y满足ax+by=d(18和24:gcd(18,24)=6,(-1)·18+(1)·24=6) 5.扩展欧几里得算法 给上面的裴蜀定理推论的方程 ax+by=d 求解

QBXT Day 4 数学,数论

China☆狼群 提交于 2020-01-27 22:11:16
今天讲一讲数论吧(虽然清明讲过了) 进制转换 我们来看10这个数怎么转换成k进制 因为10=2^3+2^1,所以10就是1010 三进制也同理10=3^2+3^0,所以就是101 我们对于一个10进制数,就可以用短除法来求解 比如55的三进制 这里我们把所有的余数向上写一遍,其实代码实现的话就直接写一个栈就可以了,还有一个没啥用的注意事项,就是读的问题 怎么把一个k进制数转成十进制的X? 假设我们有一个k进制数X,总共有n位,那么他就是XnXn-1Xn-2......X1X0 我们第i位其实就对应着k^i,我们最后计算就行了 有几种特殊的进制写法, 2进制,我要写二进制1001,那我就写int a=01001(因为正常的数不会前导0) 8进制, 10进制, 16进制,我要写1001,就是0x1001,算一下就是16^3+1=4097 注意, 16进制是0-15,大于9的数字我们用字母代替,所以就是0123456789ABCDEF 高精度 因为我们知道即使是long long也是-2^63~2^63,差不多也就是二十位左右,但是我们有那种好几百位的,就很变态了 所以我们考虑用到高精度 其实就是模拟竖式进行加减法 比如2333+233=2566 肯定就是 第一个问题,我们怎么把这个数存下来(当然是用字符数组读入然后转成) 正常想法是正着存进去啊 但是肯定是有问题的

GDUT_寒假训练题解报告_数论专题_个人题解报告——题目:B - Fedya and Maths

只愿长相守 提交于 2020-01-25 15:40:04
GDUT_寒假训练题解报告_数论专题_个人题解报告——题目:B - Fedya and Maths 题目: Fedya studies in a gymnasium. Fedya’s maths hometask is to calculate the following expression: (1n + 2n + 3n + 4n) mod 5 for given value of n. Fedya managed to complete the task. Can you? Note that given number n can be extremely large (e.g. it can exceed any integer type of your programming language). Input The single line contains a single integer n (0 ≤ n ≤ 10105). The number doesn’t contain any leading zeroes. Output Print the value of the expression without leading zeros. Examples Input 4 Output 4 Input 124356983594583453458888889

SPOJ ARCTAN (数论) Use of Function Arctan

落花浮王杯 提交于 2020-01-24 01:48:05
详细的题解见 这里 。 图片转自上面的博客 假设我们已经推导出来x在 处取得最小值,并且注意到这个点是位于两个整点之间的 ,所以从这两个整数往左右两边枚举b就能找到b+c的最小值。 其实只用往一边枚举就够了,由于对称性,我们不妨假设b ≤ c,那么只要让b从2a开始递减枚举即可。 1 #include <iostream> 2 using namespace std; 3 long long a, i; 4 int main(){int T;cin>>T;while(T--){cin>>a;i=a*2;while((i*i+1)%(i-a))i--;cout<<(i*i+1)/(i-a)<<endl;}return 0;} 代码君 来源: https://www.cnblogs.com/AOQNRMGYXLMV/p/4465619.html

美素数//HDU - 4548//数论

天大地大妈咪最大 提交于 2020-01-22 15:29:28
美素数//HDU - 4548//数论 题目 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。   问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。   给定一个区间,你能计算出这个区间内有多少个美素数吗? Input 第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。 接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。 Output 对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。 每组数据占一行,具体输出格式参见样例。 Sample Input 3 1 100 2 2 3 19 Sample Output Case #1: 14 Case #2: 1 Case #3: 4 链接:https://vjudge.net/contest/351853#problem/G 思路 先筛出素数再筛出题目需要的数 代码 # include <cstdio> # include <cstring> # include <iostream> # include <string> # include <algorithm> # include

寒假训练数论J

风流意气都作罢 提交于 2020-01-22 05:12:00
题目 解题思路 不会证明,找规律。。。 发现答案是(2^(n-1))mod(1e9+7) 由于n很大,1e9+7是个质数 由费马小定理 2^(1e9+6)≡1(mod (1e9+7)) 所以答案是(2^((n-1) mod (1e9+6)))mod(1e9+7) 代码 # include <cstdio> # include <iostream> using namespace std ; const int MOD = 1e9 + 7 ; const int p = 1e9 + 6 ; long long MI ( long long a , long long b ) { long long base = a ; long long t = 1 ; while ( b ) { if ( b & 1 ) t = ( t * base ) % MOD ; base = ( base * base ) % MOD ; b >>= 1 ; } return t ; } int main ( ) { char x = 'A' ; while ( true ) { if ( x == EOF ) break ; long long num = 0 ; bool sym = false ; while ( true ) { x = getchar ( ) ; if ( x == EOF ||

2019_GDUT_新生专题IV数论 G

二次信任 提交于 2020-01-21 19:28:57
题目:美素数 题目链接: https://vjudge.net/contest/351853#problem/G 题目描述: 美素数:各位相加后,依然是素数。 在给出区间内找美素数的个数。 1.得出素数表 2.找美素数 3.标记美素数的位置 4.通过位置得区间美素数个数。 代码: # include <stdio.h> int a [ 1000000 ] , b [ 80000 ] , c [ 80000 ] ; int f ( int x ) //找各位相加的出的结果 { int d = 0 ; while ( x / 10 ) { d + = x % 10 ; x / = 10 ; } return x + d ; } int main ( ) { int i , k , j , s , t , g ; for ( i = 0 ; i < 1e6 ; i ++ ) { a [ i ] = i ; } for ( i = 2 , k = 0 ; i < 5e5 ; i ++ ) //用线性筛搞个质数表 { if ( a [ i ] ) b [ k ++ ] = i ; for ( j = 0 ; j < k ; j ++ ) { if ( b [ j ] * i > 1e6 ) break ; a [ b [ j ] * i ] = 0 ; if ( i % b [ j ] ==

图灵计划(一)

馋奶兔 提交于 2020-01-20 08:27:46
数论的第一次应用 数论是一门研究整数的学科。为什么会有人想要研究整数呢?数论到底能在生活中哪些地方得到应用呢?数论的用处并不是显而易见的。但是数论既然偏离了人类所有的生活轨迹,那为什么会有人研究它呢? 让我们回到1937年的秋天,德国在希特勒的领导下重新武装,世界大战一触即发。此时的图灵和我们一样正思考着数论能在哪些地方被应用。他很快意识到,在战争爆发以后,能否保护盟军之间通过电报传递的密令将成为能否赢得战争的关键。于是,图灵设想,能否通过数论来加密通信呢?这个灵机一动的设想,使数论彻底的融入我们的现代生活中。如今,数论已成为众多公钥密码系统,数字签名方案,密码散列函数和数字现金系统的基础。每一次你在淘宝购物,或者使用支付宝在线支付,你都在使用数论的一些算法。 图灵在设计好他的加密和解密算法后,很快就消失在公众的视野中,直到过了半个世纪之后,人们才逐渐知道图灵当时去了哪里,他在那里做了什么样的工作。我们接下来要通过分析图灵留下的一些手稿,试图重建图灵的计划。对于计划的具体细节,我们是未知的,因为图灵从来没有向外界公布过他的计划,因此我们只是推测图灵当时可能的,合理的想法。 图灵计划第一版 图灵的计划是通过数论来加密信息,那么我们首先假设图灵把这条信息转化为一个素数。这一步并不是真正的加密,只是转化为素数有利于后面的运算,所以这一步并不是至关重要的

ACM日记

爱⌒轻易说出口 提交于 2020-01-20 01:04:30
期末考试考完了,重新回归日常学习,继续学习数论,现在的我能找到一些窍门来辨别题目,有很清晰的思路,能做出一些题,这让我很激动,非常激动!!但是效率有些低,甚至写之前要拿笔或者敲一下试半天,没有形成肌肉记忆,勉强的可以运用一些基本的数论的知识,但是还没走深,还需要进一步努力,这几天在帮家打扫卫生之余学一些数论知识。 加油!!! 来源: CSDN 作者: qq_43632924 链接: https://blog.csdn.net/qq_43632924/article/details/104043855

有理数分解-数论

风格不统一 提交于 2020-01-18 03:20:55
题目描述 Description   任何一个[0,1]中的有理数p/q(p、q均为自然数)一定可以分解成1/r1+1/r2+1/r3+…+1/rk,且r1<r2<r3<…<rk。当然这样的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一个分解式中的第二项比第二个分解式中的第二项大,因此我们可以定义第一个分解式比第二个分解式大。   程序要求找出p/q的最大分解式。 输入输出格式 Input/output 输入格式: 键盘输入p、q,1≤p≤q≤50 输出格式: 从小到大依次输出分解式中的每个分母,一行输出一个数 输入输出样例 Sample input/output 样例测试点#1 输入样例: 5 6 输出样例: 2 3 思路: 假设1/r是能从p/q中分解出来的最大分子为1的真分数,则1/r≤p/q<1/(r-1)① 又因为p/q-1/r=(p×r-q)/(q×r)② 根据①可知,p×(r-1)<q,所以p×r-p<q,代入②中可看出,每次待分解的分数的分子一定单调下降,所以就可以用单精度除法(高精度除以普通整数)解决本题。 注意:在输入p、q后要对分数进行化简。 代码如下: 1 #include <stdio.h> 2 int gcd(int a,int b)//求最大公约数 3 { 4 int r=a%b; 5 while(r>0) 6 {