收藏 分享(赏)

ACM+数论常用的模版.doc

上传人:11xg27ws 文档编号:6331228 上传时间:2019-04-07 格式:DOC 页数:28 大小:162KB
下载 相关 举报
ACM+数论常用的模版.doc_第1页
第1页 / 共28页
ACM+数论常用的模版.doc_第2页
第2页 / 共28页
ACM+数论常用的模版.doc_第3页
第3页 / 共28页
ACM+数论常用的模版.doc_第4页
第4页 / 共28页
ACM+数论常用的模版.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、1欧几里德#includeusing namespace std;int hcf(int a,int b) int r=0;while(b!=0)r=a%b;a=b;b=r;return(a); lcd(int u,int v,int h) /u=a,v=b ,h 为最小公约数=hcf(a,b);return(u*v/h);int main()int a,b,x,y;cinab;x=hcf(a,b);y=lcd(a,b,x);coutusing namespace std;_int64 ext_euclid(_int64 a,_int64 b, _int64 _int64 d;if (b=0)

2、 x=1;y=0;return a;d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;void modular_equation(_int64 a,_int64 b,_int64 c)/ax = b(mod n)_int64 d;_int64 x,y;d = ext_euclid(a,b,x,y);if ( c % d != 0 )printf(“No answern“);elsex = (x * c/d) % b ;/ 第一次求出的 x ; _int64 t = b/d;x = (x%t + t)%t;printf(“%I64dn“,x)

3、;/最小的正数的值for (int i=0;iusing namespace std;int ext_euclid(int a,int b,int if (b=0) x=1;y=0;return a;d=ext_euclid(b,a %b,x,y);t=x;x=y;y=t-a/b*y;return d;int China(int W,int B,int k) /W 为按多少排列,B 为剩余个数 WB K 为组数int i;int d,x,y,a=0,m,n=1;for (i = 0;i0)return a;elsereturn(a+n);int main()int B100,W100; 求in

4、t k ; a = 2( mod 5 )cin k ; a = 3( mod 13)for(int i = 0 ; i Wi; 5 2cin Bi; 13 3 输出 42coutusing namespace std;int phi1000; /数组中储存每个数的欧拉数void genPhi(int n)/求出比 n 小的每一个数的欧拉数(n-1 的)int i, j, pNum = 0 ;memset(phi, 0, sizeof(phi) ;phi1 = 1 ;for(i = 2; i 1)ret*=n-1;return ret; /n 的欧拉数5行列式计算#include using n

5、amespace std;int js(int s100100,int n) int z,j,k,r,total=0; int b100100; /*bNN用于存放,在矩阵 sNN中元素 s0的余子式*/ if(n2)for(z=0;z=z) bjk=sj+1k+1; else bjk=sj+1k; if(z%2=0) r=s0z*js(b,n-1); /*递归调用*/ else r=(-1)*s0z*js(b,n-1); total=total+r; else if(n=2)total=s00*s11-s01*s10; return total; 排列long A(long n,long m

6、) /nmlong a=1;while(m!=0) a*=n;n-;m-;return a; 组合long C(long n,long m) /nmlong i,c=1;i=m;while(i!=0) c*=n;n-;i-;while(m!=0) c/=m;m-; return c; 6大数乘大数#include #include using namespace std;char a1000,b1000,s10000;void mult(char a,char b,char s) /a 被乘数,b 乘数,s 为积int i,j,k=0,alen,blen,sum=0,res6565=0,fla

7、g=0;char result65;alen=strlen(a);blen=strlen(b); for (i=0;i=0;i-)for (j=blen-1;j=0;j-) sum=sum+resi+blen-j-1j;resultk=sum%10;k=k+1;sum=sum/10;for (i=blen-2;i=0;i-)for (j=0;j=0;i-) si=resultk-1-i;sk=0;while(1)if (strlen(s)!=strlen(a)elsebreak;int main()cinab;mult(a,b,s);coutusing namespace std;char a

8、100,t1000;void mult(char c,int m,char t) / c 为大数,m=10) si=k%10;add=k/10;flag=1; else si=k;flag=0;add=0;if (flag) l=i+1;si=add; else l=i;for (i=0;iai;mult(a,i,t);cout#include using namespace std;char a1000,b1000,s10000;void add(char a,char b,char s)/a 被加数,b 加数,s 和int i,j,k,up,x,y,z,l;char *c;if (strl

9、en(a)strlen(b) l=strlen(a)+2; else l=strlen(b)+2;c=(char *) malloc(l*sizeof(char);i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i=0|j=0)if(i9) up=1;z%=10; else up=0;ck+=z+0;i-;j-;if(up) ck+=1;i=0;ck=0;for(k-=1;k=0;k-)si+=ck;si=0; int main()cinab;add(a,b,s);coutusing namespace std;char a1000,b1000,s1000

10、0;void sub(char a,char b,char s)int i,l2,l1,k;l2=strlen(b);l1=strlen(a);sl1=0;l1-;for (i=l2-1;i=0;i-,l1-)if (al1-bi=0) sl1=al1-bi+0;elsesl1=10+al1-bi+0;al1-1=bl1-1-1;k=l1;while(ak=0) sl1=al1;l1-;loop:if (s0=0) l1=strlen(a);for (i=0;iab;sub(a,b,s);cout#include using namespace std;long a10000;int fact

11、orial(int n) /n 为所求阶乘的 n!的 nint i,j,c,m=0,w; a0=1; for(i=1;i0) m+;am=c; w=m*4+log10(am)+1;printf(“%ld“,am); / 输出for(i=m-1;i=0;i-) /printf(“%4.4ld“,ai);/printf(“n“);return w; /返回值为阶乘的位数储存方法很巧,每一个 ai中存四位,不足四位在前加 0 补齐大数求余int mod(int B) /A 为大数,B 为小数int i = 0,r = 0;while( Ai != 0 )r=(r*10+Ai+-0)%B;return

12、 r ; /r 为余数11高精度任意进制转换#include #include using namespace std;char s1000,s21000; / s:原进制数字,用字符串表示,s2:转换结果,用字符串表示long d1,d2; / d1:原进制数,d2:需要转换到的进制数void conversion(char s,char s2,long d1,long d2)long i,j,t,num;char c;num=0;for (i=0;si!=0;i+)if (si=0) t=si-0; else t=si-A+10;num=num*d1+t;i=0;while(1)t=num

13、%d2;if (tsd1d2;conversion(s,s2,d1,d2);cout/基本方法,n 为所求数,返回 1 位素数,0 为合数#include using namespace std;int comp(int n)int i,flag=1;for (i=2;i2 和正整数 s,该算法出错概率 至多为 2(-s),因此,增大 s 可以减小出错概 率,一般取 s=50 就足够了。#include#include using namespace std;int Witness(int a, int n) int i, d = 1, x; for (i = ceil( log( (floa

14、t) n - 1 ) / log(2.0) ) - 1; i = 0; i-) x = d; d = (d * d) % n; if ( (d = 1) if ( ( (n - 1) return (d = 1 ? 0 : 1); int Miller_Rabin(int n, int s) int j, a; for (j = 0; j x;cout #include using namespace std; char t1010,p100; /t 为大字符串,p 为小字符串 int next100;void sn()int j,k; next0=-1; j=1; do k=nextj-1;

15、 while(k!=-1 nextj=k+1; j+=1; while(pj!=0); int match(int x) /x 是大字符串下标,从头开始为 0,j 为小字符串下标 int k=x,j=0; if(t0=0)return 0; while(tk!=0) while(j!=-1 k+=1;j+=1; if(pj=0)return k-j; /返回 p 所在的下标 return -1; /搜索失败返回-1 int main()int x=0;sn();int r=match( x );cout ak-1 ,而 bk= ak + k ak-1 + k-1 = bk-1 ak-1 。所以

16、性质 1。成立。2。任意操作都可将奇异局势变为非奇异局势。事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。3。采用适当的方法,可以将非奇异局势变为奇异局势。假设面对的局势是(a,b) ,若 b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0) ;如果 a = ak ,b bk,那么,取走 b - bk 个物体,即变为奇异局势;如果 a = ak , b ak ,b= ak + k,则从第一堆中拿走多余的数量 a

17、 - ak 即可;如果 a (1,8,9)奇异局势乙:(1,8,9)-(1,8,4)甲:(1,8,4)-(1,5,4)奇异局势乙:(1,5,4)-(1,4,4)甲:(1,4,4)-(0,4,4)奇异局势乙:(0,4,4)-(0,4,2)甲:(0.4,2)-(0,2,2)奇异局势乙:(0,2,2)-(0,2,1)甲:(0,2,1)-(0,1,1)奇异局势乙:(0,1,1)-(0,1,0)甲:(0,1,0)-(0,0,0)奇异局势甲胜。17叉乘法求任意多边形面积语法:result=polygonarea(Point *polygon,int N);参数:*polygon: 多变形顶点数组N: 多边

18、形顶点数目返回值: 多边形面积注意: 支持任意多边形,凹、凸皆可多边形顶点输入时按顺时针顺序排列源程序: typedef struct double x,y; Point; double polygonarea(Point *polygon,int N)int i,j;double area = 0;for (i=0;i y ? x : y)typedef struct double x,y; Point;int insidepolygon(Point *polygon,int N,Point p) int counter = 0;int i;double xinters;Point p1,p

19、2;p1 = polygon0;for (i=1;i MIN(p1.y,p2.y) if (p.y y ? x : y) typedef struct double x,y; Point;int FC(double x1,double x2)if (x1-x2-0.000002) return 1; else return 0;int Pointonline(Point p1,Point p2,Point p)double x1,y1,x2,y2;x1=p.x-p1.x;x2=p2.x-p1.x;y1=p.y-p1.y;y2=p2.y-p1.y;if (FC(x1*y2-x2*y1,0)=0)

20、 return 0;if (MIN(p1.x,p2.x) y ? x : y) typedef struct double x,y; Point;int lineintersect(Point p1,Point p2,Point p3,Point p4)Point tp1,tp2,tp3;if (p1.x=p3.x/快速排斥试验if (MIN(p1.x,p2.x)=0) return 1; else return 0;点到线段最短距离语法:result=mindistance(Point p1,Point p2,Point q);参数:p1、p2: 线段的两个端点q: 判断点22返回值: 点

21、q 到线段 p1p2 的距离注意: 需要 math.h源程序: #define MIN(x,y) (x y ? x : y)typedef struct double x,y; Point;double mindistance(Point p1,Point p2,Point q)int flag=1;double k;Point s;if (p1.x=p2.x) s.x=p1.x;s.y=q.y;flag=0;if (p1.y=p2.y) s.x=q.x;s.y=p1.y;flag=0;if (flag)k=(p2.y-p1.y)/(p2.x-p1.x);s.x=(k*k*p1.x+k*(q.

22、y-p1.y)+q.x)/(k*k+1);s.y=k*(s.x-p1.x)+p1.y;if (MIN(p1.x,p2.x)#include using namespace std;const int MAX = 500;long long dataMAXMAX;int main()int i,j;memset(data, 0, sizeof(int)*MAX);for(i = 0; i sum) dataij = 0;else if(i = sum) dataij = 1;elseif(i = j) dataij = 1 + dataij-1;else if(i n)cout = k; n-=

23、k,k+)datak = k;for(int i = k-1; i = 2 i-, n-)datai+;datak-1 += n;for(int j = 2; j /求出可分解个数#include using namespace std;const int MAX = 600;long long dataMAXMAX;int main()int i,j;memset(data, 0, sizeof(int)*MAX);for(j = 0; j n)cout /列出分解情况#include using namespace std;const int MAX = 300;int dataMAX;i

24、nt main()int i,n;cin n;for(i = 0; i 1)int t, p, r;t = datasize-1 + datasize-2;p = t / (datasize-2+1);r = t % (datasize-2+1);t = datasize-2+1;i = size - 2;size = size - 2 + p;for(; i nkm ) /n 代表有多少个人 , k 表示叫到 k 的人出列 , m 表示第一次谁先开始叫start = 0;if( !n for(i = 1 ;i main()int n, m, i, s=0;printf (“N M = “);

25、 scanf(“%d%d“, for (i=2; i#include#define limit 1e-6using namespace std;double x, y , c,p , a , b ;double f(double l)return c*sqrt(x*x-l*l)+c*sqrt(y*y-l*l)-sqrt(x*x-l*l)*sqrt(y*y-l*l);int main()28double mid;while(cinxyc)a = 0;if(x y)swap(x,y);b = x; /f(a) = 0mid = (a + b ) * 0.5000;while(1)if(fabs(f(mid) limit)printf(“%.3fn“,mid);break;if(f(mid)*f(a) = 0)b = mid;mid = 0.5000*(a + mid);if(f(mid)*f(b) = 0)a = mid;mid = 0.5000*(mid + b); return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报