ACM数论方面十道基础题目详解
ACM中数论基础知识的运用

数论初步:一,整除与因式分解:1,算术基本定理: n =a1^r1*a2^r2*a3^r3……2,求素数:(试除法,筛选法):素数测试费马小定理:若p为素数,则对于任意小于p的正整数a,有a(p-1)≡1(mod p)证明:用欧拉定理直接得出二次探测定理:若p为素数,a2≡1(mod p)小于p的正整数解只有1和p-1满足费马小定理和二次探测定理的数可以确定是素数Miller-Rabin算法算法步骤:判定n是否为素数令n-1=m*2j,m为奇数随机在2到(n-1)之间取一个整数b令v=bm,之后每次对v平方,当v=1时,若上一次的v既不是1也不是(n-1),由二次探测定理,n不是素数,退出;不断循环直到计算出b(n-1)v=1,满足费马小定理,通过测试;否则n一定不是素数 选取几个不同的b多次测试Miller-Rabin只能算一种测试,因为通过测试的数不一定是素数,非素数通过测试的概率是1/4虽然一次测试的结果不一定令人满意,但五六次随机测试基本可以保证正确率超过99.9%For (int i = 2; i < n ;i++){For (int j = 2,flay = 1; j < sqrt (n); j++)If (I % j == 0){Printf (“i不是素数”);flay = 0;}Printf (“I是素数”);}3 ,int m = sqrt (n+0.5);int c = 0;memset (vis,0,sizeof (vis));for (int i = 2; i < = m; i++)if (!vis[i]){prime[c++] = i;for (int j = i*i; j <= n; j+= i) vis[j] = 1;}4,int isprime[N];int cnt;int isok (int x){for(int i = 0; i < cnt && isprime[i] * isprime[i] <= x; i++)if (x % isprime[i] == 0) return 0;return 1;}void getprime (){isprime[0] = 2;isprime[1] = 3;cnt = 2;for (int i = 5; i < maxn; i++)if (isok (i))isprime[cnt++] = i;}5,因式分解:int Factor (int num){int m = 0;for (int i = 0; i < cnt && isprime[i]*isprime[i] <= num; i++){if (num%isprime[i] == 0){arr[++m] = isprime[i];r[m] = 0;while (num % isprime[i] == 0 && num){r[m]++;num/= isprime[i];}}}if (num > 1){arr[++m] = num;r[m] = 1;}return m;}6,求约数:void dfs (int now,int q,int m,int a,int b){if (flay) return ;if (q > a) return ;if (now == m+1){q 就是约数…..return ;}for (int i = 0,t = 1;i <= r[now];i++,t*=arr[now]){dfs (now+1,q*t,m,a,b);}}例题分析:Fzu上的题:()求一个数的真因子个数(不包括本身)。
(2020年编辑)ACM必做50题的解题-数论

poj 1061 青蛙的约会这题用的是解线性同余方程的方法,之前没接触到过,搜索资料后看到一个人的博客里面讲的很好就拷贝过来了。
内容如下:对于方程:ax≡b(mod m),a,b,m都是整数,求解x 的值,这个就是线性同余方程。
符号说明:mod表示:取模运算ax≡b(mod m)表示:(ax - b) mod m = 0,即同余gcd(a,b)表示:a和b的最大公约数求解ax≡b(mod n)的原理:对于方程ax≡b(mod n),存在ax + by = gcd(a,b),x,y是整数。
而ax≡b(mod n)的解可以由x,y来堆砌。
具体做法如下:第一个问题:求解gcd(a,b)定理一:gcd(a,b) = gcd(b,a mod b)欧几里德算法int Euclid(int a,int b){if(b == 0)return a;elsereturn Euclid(b,mod(a,b));}附:取模运算int mod(int a,int b){if(a >= 0)return a % b;elsereturn a % b + b;}第二个问题:求解ax + by = gcd(a,b)定理二:ax + by = gcd(a,b)= gcd(b,a mod b) = b * x' + (a mod b) * y'= b * x' + (a - a / b * b) * y'= a * y' + b * (x' - a / b * y')= a * x + b * y则:x = y'y = x' - a / b * y'以上内容转自/redcastle/blog/item/934b232dbc40d336349bf7e4.html由这个可以得出扩展的欧几里德算法:int exGcd(int a, int b, int &x, int &y) {if(b == 0){x = 1;y = 0;return a;}int r = exGcd(b, a % b, x, y);int t = x;x = y;y = t - a / b * y;return r;}代码:#include<iostream>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;__int64 mm,nn,xx,yy,l;__int64 c,d,x,y;__int64 modd(__int64 a, __int64 b){if(a>=0)return a%b;elsereturn a%b+b;}__int64 exGcd(__int64 a, __int64 b) {if(b==0){x=1;y=0;return a;}__int64 r=exGcd(b, a%b);__int64 t=x;x=y;y=t-a/b*y;return r;}int main(){scanf("%I64d %I64d %I64d %I64d %I64d",&xx,&yy,&mm,&nn,&l);if(mm>nn) //分情况{d=exGcd(mm-nn,l);c=yy-xx;}else{d=exGcd(nn-mm,l);c=xx-yy;}if(c%d != 0){printf("Impossible\n");return 0;}l=l/d;x=modd(x*c/d,l); ///取模函数要注意printf("%I64d\n",x);system("pause");return 0;}POJ 1142 SmithNumber题意:寻找最接近而且大于给定的数字的SmithNumber什么是SmithNumber?用sum(int)表示一个int的各位的和,那一个数i如果是SmithNumber,则sum(i) =sigma( sum(Pj )),Pj表示i的第j个质因数。
acm试题及答案2

acm试题及答案2ACM试题及答案21. 问题描述:编写一个程序,计算给定整数序列中的最大子段和。
2. 输入格式:第一行包含一个整数N,表示序列的长度。
第二行包含N个整数,表示序列中的整数。
3. 输出格式:输出一个整数,表示序列中的最大子段和。
4. 样例输入:```51 -2 -34 -1```5. 样例输出:```6```6. 问题分析:该问题可以通过动态规划的方法来解决。
定义一个数组dp,其中dp[i]表示以第i个元素结尾的最大子段和。
状态转移方程为dp[i] = max(dp[i-1] + nums[i], nums[i])。
7. 算法实现:```pythondef maxSubArray(nums):n = len(nums)dp = [0] * ndp[0] = nums[0]max_sum = nums[0]for i in range(1, n):dp[i] = max(dp[i-1] + nums[i], nums[i])max_sum = max(max_sum, dp[i])return max_sum```8. 复杂度分析:时间复杂度为O(n),其中n为序列的长度。
空间复杂度为O(n)。
9. 测试用例:- 输入:`[3, -2, 4]`输出:`5`- 输入:`[-2, 1, -3, 4, -1, 2, 1, -5, 4]`输出:`6`10. 注意事项:- 确保输入的序列长度N大于等于1。
- 序列中的整数可以是负数或正数。
- 输出结果应该是一个整数。
11. 扩展思考:- 如何优化算法以减少空间复杂度?- 如果序列中的整数是浮点数,算法是否仍然有效?12. 参考答案:- 可以通过只使用一个变量来存储最大子段和,以及一个变量来存储当前子段和,从而将空间复杂度优化到O(1)。
- 如果序列中的整数是浮点数,算法仍然有效,但需要注意浮点数运算的精度问题。
ACM中的数学问题

筛法(改进)
用bool数组+双向链表实现,空间复杂度仍为 O(n)
小优化:初始时只加入奇数
15
第15页/共46页
欧拉函数的前奏
(a, m)=1, (a, n)=1 (a, mn)=1 若(m, n)=1, 则0至mn-1之间的数
所有的数用m, n 的余数表法唯一 有几个是m的倍数?有几个是n的倍数? 有几个既是m的倍数,又是n的倍数? 若该数不是m的倍数,则它与m互素吗?
18ห้องสมุดไป่ตู้
第18页/共46页
欧拉函数
记φ(x)为与x互质且小于等于x的正整数的个 数, φ(x)就是欧拉函数。
19
第19页/共46页
欧拉函数
性质1:
若p为素数,φ(p) = p-1.
性质2:
若p为素数,φ(pk)=pk-1(p-1)
性质3:
若(p, q)=1,φ(pq) = φ(p) φ(q) .
初始时容器内为2到n的所有正整数 取出容器中最小的数p,p一定是质数
删去所有的pi, 令q为第一个未被删除的数,保留q,删去所有的piq, 再令q为下一个未被删除的数...直到q遍历所有未被
删除的数为止(这一步骤可以把最小质因数为p的所 有数删去)
重复上面两个步骤直到容器为空
14
第14页/共46页
7
第7页/共46页
关于互质的性质
a与b,c同时互质,则a与b*c也互质 p为质数,p|b*cp|b or p|c c|a*b and (a,c)=1c|b ak与b互质(k>=1),则a与b也互质 a≡1(mod b),则a与b互质
8
第8页/共46页
常见的两数互质情况
最新acm入门简单数学题(精品ppt课件

06.01.2021
28
请自己仔细分析...
哪位同学做个陈述?
06.01.2021
29
课后任务:
完成在线练习:
201309《ACM程序设计》作业(2)—— 刘春英 老师
特别提醒:
作业务必尽力完成(第一次的作 业尚未完成的,一定要补上~)
作业密码:helloworld
06.01.2021
30
Welcome to HDOJ
Thank You ~
06.01.2021
31
公民反恐防范知识宣 资料
(宜宾市反恐办宣)
1.如何识别恐怖嫌疑人员?
• (1)神情慌张,言行异常者; • (2)着装、携带物品与其身份明显不符,服装奇异; • (3)携带有管制刀具、斧头以及类似爆炸物等危险物品 • (4)频繁进出大型活动场所,反复在商场、医院、车站
ACM入门简单数学题(精品)
今天,
你 了吗?
06.01.2021
2
很常见的一种写法:
#include<stdio.h>
int main()
{ int n, i, sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+i;
printf("%d\n",sum);
}
06.01.2021
23
HDOJ_1005: Number Sequence
06.01.2021
24
Question:
暴力(Brute-Force) 能解决问题吗?
ACM基础题目列表

题目【题目1】N皇后问题(八皇后问题的扩展)【题目2】排球队员站位问题【题目3】把自然数N分解为若干个自然数之和。
【题目4】把自然数N分解为若干个自然数之积。
【题目5】马的遍历问题。
【题目6】加法分式分解【题目7】地图着色问题【题目8】在n*n的正方形中放置长为2,宽为1的长条块,【题目9】找迷宫的最短路径。
(广度优先搜索算法)【题目10】火车调度问题【题目11】农夫过河【题目12】七段数码管问题。
【题目13】把1-8这8个数放入下图8个格中,要求相邻的格(横,竖,对角线)上填的数不连续.【题目14】在4×4的棋盘上放置8个棋,要求每一行,每一列上只能放置2个.【题目15】迷宫问题.求迷宫的路径.(深度优先搜索法)【题目16】一笔画问题【题目17】城市遍历问题.【题目18】棋子移动问题【题目19】求集合元素问题(1,2x+1,3X+1类)================================================================================================================================================================【题目】N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,问可能的方案及方案数。
const max=8;var i,j:integer;a:array[1..max] of 0..max; {放皇后数组}b:array[2..2*max] of boolean; {/对角线标志数组}c:array[-(max-1)..max-1] of boolean; {\对角线标志数组}col:array[1..max] of boolean; {列标志数组}total:integer; {统计总数}procedure output; {输出}var i:integer;beginwrite('No.':4,'[',total+1:2,']');for i:=1 to max do write(a[i]:3);write(' ');if (total+1) mod 2 =0 then writeln; inc(total);end;function ok(i,dep:integer):boolean; {判断第dep行第i列可放否}beginok:=false;if ( b[i+dep]=true) and ( c[dep-i]=true) {and (a[dep]=0)} and(col[i]=true) then ok:=trueend;procedure try(dep:integer);var i,j:integer;beginfor i:=1 to max do {每一行均有max种放法}if ok(i,dep) then begina[dep]:=i;b[i+dep]:=false; {/对角线已放标志}c[dep-i]:=false; {\对角线已放标志}col[i]:=false; {列已放标志}if dep=max then outputelse try(dep+1); {递归下一层}a[dep]:=0; {取走皇后,回溯}b[i+dep]:=true; {恢复标志数组}c[dep-i]:=true;col[i]:=true;end;end;beginfor i:=1 to max do begin a[i]:=0;col[i]:=true;end;for i:=2 to 2*max do b[i]:=true;for i:=-(max-1) to max-1 do c[i]:=true;total:=0;try(1);writeln('total:',total);end.【测试数据】n=8 八皇后问题No.[ 1] 1 5 8 6 3 7 2 4 No.[ 2] 1 6 8 3 7 4 2 5 No.[ 3] 1 7 4 6 8 2 5 3 No.[ 4] 1 7 5 8 2 4 6 3 No.[ 5] 2 4 6 8 3 1 7 5 No.[ 6] 2 5 7 1 3 8 6 4 No.[ 7] 2 5 7 4 1 8 6 3 No.[ 8] 2 6 1 7 4 8 3 5 No.[ 9] 2 6 8 3 1 4 7 5 No.[10] 2 7 3 6 8 5 1 4 No.[11] 2 7 5 8 1 4 6 3 No.[12] 2 8 6 1 3 5 7 4 No.[13] 3 1 7 5 8 2 4 6 No.[14] 3 5 2 8 1 7 4 6 No.[15] 3 5 2 8 6 4 7 1 No.[16] 3 5 7 1 4 2 8 6 No.[17] 3 5 8 4 1 7 2 6 No.[18] 3 6 2 5 8 1 7 4 No.[19] 3 6 2 7 1 4 8 5 No.[20] 3 6 2 7 5 1 8 4 No.[21] 3 6 4 1 8 5 7 2 No.[22] 3 6 4 2 8 5 7 1 No.[23] 3 6 8 1 4 7 5 2 No.[24] 3 6 8 1 5 7 2 4 No.[25] 3 6 8 2 4 1 7 5 No.[26] 3 7 2 8 5 1 4 6 No.[27] 3 7 2 8 6 4 1 5 No.[28] 3 8 4 7 1 6 2 5 No.[29] 4 1 5 8 2 7 3 6 No.[30] 4 1 5 8 6 3 7 2 No.[31] 4 2 5 8 6 1 3 7 No.[32] 4 2 7 3 6 8 1 5 No.[33] 4 2 7 3 6 8 5 1 No.[34] 4 2 7 5 1 8 6 3 No.[35] 4 2 8 5 7 1 3 6 No.[36] 4 2 8 6 1 3 5 7No.[37] 4 6 1 5 2 8 3 7 No.[38] 4 6 8 2 7 1 3 5No.[39] 4 6 8 3 1 7 5 2 No.[40] 4 7 1 8 5 2 6 3No.[41] 4 7 3 8 2 5 1 6 No.[42] 4 7 5 2 6 1 3 8No.[43] 4 7 5 3 1 6 8 2 No.[44] 4 8 1 3 6 2 7 5No.[45] 4 8 1 5 7 2 6 3 No.[46] 4 8 5 3 1 7 2 6No.[47] 5 1 4 6 8 2 7 3 No.[48] 5 1 8 4 2 7 3 6No.[49] 5 1 8 6 3 7 2 4 No.[50] 5 2 4 6 8 3 1 7No.[51] 5 2 4 7 3 8 6 1 No.[52] 5 2 6 1 7 4 8 3No.[53] 5 2 8 1 4 7 3 6 No.[54] 5 3 1 6 8 2 4 7No.[55] 5 3 1 7 2 8 6 4 No.[56] 5 3 8 4 7 1 6 2No.[57] 5 7 1 3 8 6 4 2 No.[58] 5 7 1 4 2 8 6 3No.[59] 5 7 2 4 8 1 3 6 No.[60] 5 7 2 6 3 1 4 8No.[61] 5 7 2 6 3 1 8 4 No.[62] 5 7 4 1 3 8 6 2No.[63] 5 8 4 1 3 6 2 7 No.[64] 5 8 4 1 7 2 6 3No.[65] 6 1 5 2 8 3 7 4 No.[66] 6 2 7 1 3 5 8 4No.[67] 6 2 7 1 4 8 5 3 No.[68] 6 3 1 7 5 8 2 4No.[69] 6 3 1 8 4 2 7 5 No.[70] 6 3 1 8 5 2 4 7No.[71] 6 3 5 7 1 4 2 8 No.[72] 6 3 5 8 1 4 2 7No.[73] 6 3 7 2 4 8 1 5 No.[74] 6 3 7 2 8 5 1 4No.[75] 6 3 7 4 1 8 2 5 No.[76] 6 4 1 5 8 2 7 3No.[77] 6 4 2 8 5 7 1 3 No.[78] 6 4 7 1 3 5 2 8No.[79] 6 4 7 1 8 2 5 3 No.[80] 6 8 2 4 1 7 5 3No.[81] 7 1 3 8 6 4 2 5 No.[82] 7 2 4 1 8 5 3 6No.[83] 7 2 6 3 1 4 8 5 No.[84] 7 3 1 6 8 5 2 4No.[85] 7 3 8 2 5 1 6 4 No.[86] 7 4 2 5 8 1 3 6No.[87] 7 4 2 8 6 1 3 5 No.[88] 7 5 3 1 6 8 2 4No.[89] 8 2 4 1 7 5 3 6 No.[90] 8 2 5 3 1 7 4 6No.[91] 8 3 1 6 2 5 7 4 No.[92] 8 4 1 3 6 2 7 5 total:92对于N皇后:┏━━━┯━━┯━━┯━━┯━━┯━━┯━━┯━━┓┃皇后N│ 4 │ 5 │ 6 │ 7│ 8 │ 9 │ 10 ┃┠───┼──┼──┼──┼──┼──┼──┼──┨┃方案数│ 2 │ 10 │ 4 │ 40 │ 92 │352 │724 ┃┗━━━┷━━┷━━┷━━┷━━┷━━┷━━┷━━┛【题目】排球队员站位问题┏━━━━━━━━┓图为排球场的平面图,其中一、二、三、四、五、六为位置编号,┃┃二、三、四号位置为前排,一、六、五号位为后排。
step1-数论 程序设计基础题ACM

目录数A01 敲七 (1)数A02 三角形面积 (2)数A03 3n+1数链问题 (3)数A04 统计同成绩学生人数 (4)数A05 分解素因子 (5)数A06 亲和数 (6)数B01 寒冰王座 (7)数B02 整数对 (8)数B03 麦森数 (9)数B04 Feli的生日礼物 (10)注:数表示本题属于初等数论,A表示简单,B表示稍难。
数A01 敲七【问题描述】输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)【数据输入】一个整数N。
(N不大于30000)【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。
【样例输入】20【样例输出】71417数A02 三角形面积【问题描述】给出三角形的三个边长为a,b,c,根据海伦公式来计算三角形的面积:s = (a+b+c)/2;area = sqrt(s*(s-a)*(s-b)*(s-c));【数据输入】测试的数据有任意多组,每一组为一行。
每一行为三角形的三个边长为a,b,c;【数据输出】输出每一个三角形的面积,两位小数。
如果不是一个三角形,则输出错误提示信息:“Input error!”【样例输入】3 4 56 8 101 2 3【样例输出】6.0024.00Input error!数A03 3n+1数链问题【问题描述】在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。
然而,在很多情况我们并不知道哪一类问题可以解决,那一类问题不可解决。
现在我们就有这样一个问题,问题如下:1. 输入一个正整数n;2. 把n显示出来;3. 如果n=1则结束;4. 如果n是奇数则n变为3n+1 ,否则n变为n/2;5. 转入第2步。
例如对于输入的正整数22,应该有如下数列被显示出来:22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1我们推测:对于任意一个正整数,经过以上算法最终会推到1。
acm基础试题及答案

acm基础试题及答案ACM基础试题及答案1. 以下哪个选项是C语言中正确的字符串声明方式?A. char str[] = "Hello World";B. char str[10] = "Hello World";C. string str = "Hello World";D. char str = "Hello World";答案:A2. 在C++中,以下哪个关键字用于定义类的私有成员?A. publicB. privateC. protectedD. static答案:B3. 以下哪个数据结构允许快速随机访问元素?A. 链表B. 队列C. 数组D. 栈答案:C4. 在Python中,以下哪个函数用于将列表中的元素连接成一个字符串?A. join()B. concat()C. append()D. merge()答案:A5. 在数据库管理系统中,SQL代表什么?A. Structured Query LanguageB. Standard Query LanguageC. Simple Query LanguageD. System Query Language答案:A6. 在HTML中,用于定义最重要的标题的标签是什么?A. <h1>B. <title>C. <header>D. <h6>答案:A7. 在JavaScript中,以下哪个方法用于将字符串转换为小写?A. toUpperCase()B. toLowerCase()C. toUpperCase()D. toCamelCase()答案:B8. 在Unix/Linux系统中,哪个命令用于查看当前目录下的文件和文件夹?A. lsB. pwdC. cdD. mkdir答案:A9. 在C语言中,以下哪个函数用于计算数组中元素的总和?A. sum()B. count()C. sizeof()D. memset()答案:A10. 在Java中,以下哪个关键字用于创建单例模式?A. staticB. finalC. synchronizedD. volatile答案:A。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
a=n-m;
b=l;
c=x-y;
r=gcd(a,b);
if(c%r)
{
printf("Impossible\n");
continue;
}
a/=r;
b/=r;
c/=r;
exgcd(a,b,k1,k2);
直接给出>
main()
{
int a,b,c,n;
scanf("%d%d%d",&a,&b,&c);
for(n=11;n<100;n++)
if(n%3==a&&n%5==b&&n%7==c)
printf("%d\n",n);
}
中国剩余定理思路代码:
inline int Gcd(int m,int n) //求最大公约数
{
if (m==0) return n;
return Gcd(n%m,m);
}
int main()
{
int n,a,b,g;
cin>>n;
while(n--)
{
cin>>a>>b;
g=Gcd(a,b);
cout<<g<<" "<<a*b/g<<endl;
if(n<=0)
n+=21252;
printf("%d\n",n);
}
}
3、
/JudgeOnline/problem.php?pid=34
这个题目也是很经典的中国剩余问题类的题目,思路跟上面差不多这道题目因为数据范围很小实际上暴力就可以过,但是这个题目不失为练习中国剩余的很好题目,所以建议大家用中国剩余定理做一下。
}
void exgcd(__int64 a,__int64 b,__int64 &m,__int64 &n)
{
if(b==0)
{
m=1;
n=0;
return ;
}
exgcd(b,a%b,m,n);
__int64 t;
t=m;
m=n;
n=t-a/b*n;
}
int main()
{
__int64 x,y,m,n,l,a,b,c,k1,k2,r,t;
int mod(int k,int x,int c)
{
int a=1;
long long r=k;
while(x)
{
if(x&1)
a=(a*r)%c;
r=((r%c)*(r%c))%c;
x=x>>1;
}
return a;
}
int main()
{
int n,a,b,c;
cin>>n;
while(n--)
}
}
2、
/JudgeOnline/problem.php?pid=151
很经典的中国剩余问题。
题目大意是:
那么再次达到最高值时间为n,则有:
那么找到
k1:k1%23==0&&k1%28==0&&k1%33==1
k2:k2%33==0&&k2%28==0&&k2%23==1
t=c*k1/b;//注1
k1=c*k1-t*b;
if(k1<0)
k1+=b;
printf("%I64d\n",k1);
}
return 0;
}
6、
/showproblem.php?pid=1019
这道题目是要求出多个数的最小公倍数,求n个数的最小公倍数我们最容易想到的思路就是求出两个数的最小公倍数,然后再用这个最小公倍数与第三个数球最小公倍数,依次下去就可以求出n个数的最小公倍数了。至于两个数的最小公倍数我们从上面的习题中已经可以知道方法了。
这个题目是要求出a的b次方对c取余的值。
显然我们不能求出a^b后再对c取余,a^b可能是一个很大的数,而且这样做肯定很慢。那么我们利用同余定理来解决这个问题。
当然最简单的我们会想到:a^b%c=((a^(b-1)%c)*(a%c))%c;
但是这样效率依然是很低的。
那么我们考虑一种叫做二分快速幂的思路。
1、
/JudgeOnline/problem.php?pid=40
这道题目是非常基础的题目,在学习了欧几里德算法之后,应该很好就能做的出来了。注意两个数的最小公倍数和最大公约数之间有关系为:a
代码如下:
#include<iostream>
using namespace std;
{
cin>>a>>b>>c;
cout<<mod(a,b,c)<<endl;
}
}
5、
/problem?id=1061
这道题目用到了扩展欧几里德算法。
设过s步后两青蛙相遇,则必满足以下等式:(x+m*s)-(y+n*s)=k*l(k=0,1,2....)
稍微变一下形得:(n-m)*s+k*l=x-y
令n-m=a,k=b,x-y=c,即a*s+b*l=c
只要上式存在整数解,则两青蛙能相遇,否则不能。
这样问题就转化为了扩展欧几里德问题了。
代码如下:
# include <stdio.h>
__int64 gcd(__int64 a,__int64 b)
{
if(b==0)
return a;
return gcd(b,a%b);
关键改进就是:a^b%c=((a^(b/2)%c)*(a^(b/2)%c))%c
比如我们要算3^25%4的值,由于25=1+8+16,那么我们就只需要知道3^1,3^8,3^16的值。这样复杂度就从O(n)降低为O(log(n))了。
代码实现如下:
#include <iostream>
using namespace std;
#include<stdio.h>
int main()
{
int a,b,c,m;
scanf("%d %d %d",&a,&b,&c);
m=(70*a+21*b+15*c)%105;
printf("%d\n",m);
return 0;
}
4、
/JudgeOnline/problem.php?pid=102
k3:k3%33==0&&k3%23==0&&k3%28==1
则n=k2*p+k3*e+k1*i+k*21252;
代码如下:
#include <stdio.h>
int main()
{
int n,a,b,c,t;
while(scanf("%d%d%d%d",&a,&b,&c,&t),~a)
{
n=(5544*a+14421*b+1288*c)%21252-t;