比赛链接:click here~~
hdu 5344 MZL's xor
【题意】:
2 3 5 5 7 6 8 8 9
14 16
/*************hdu 5344 ************** #include <bits/stdc++.h> using namespace std; typedef long long LL; LL num[100000000]; int t,n,m,z,l; int main() { scanf("%d",&t); while(t--) { scanf("%d %d %d %d",&n,&m,&z,&l); num[1]=0; for(int i=2; i<=n; ++i) { num[i]=(num[i-1]*m+z)%l; } num[1]=0; for(int i=2; i<=n; ++i) { num[1]^=(num[i]+num[i]); } printf("%d\n",num[1]); } return 0; }
6 1 2 1 3 3 1 3 1 4 3
3 4
#include <bits/stdc++.h> using namespace std; struct cmp { bool operator () (int x,int y){ return x>y; } }; int main() { int t,op,m; int maxx=-1e9; scanf("%d",&t); priority_queue< int ,vector <int>,cmp> val; while(t--){ scanf("%d",&op); if(op==1){ scanf("%d",&m); val.push(m); maxx=max(maxx,m); } else if(op==2){ if(!val.empty()){ val.pop(); } if(val.empty()){ maxx=-1e9; } } else{ if(val.empty()){ puts("0"); continue; } printf("%d\n",maxx); } } return 0; }
给出一个斐波那契字符串,求截取前m个字符串得到之后的最大重复子串
ps:最后一个小时推出了规律,就是斐波那契数列!调试完大数模板,在比赛最后一分钟提交,可惜超内存了囧~~最后题目拉到hduoj上之后,改了一下取模的大数类型就过了啊,真心后悔比赛的时候没有认真去看题,没有和队友讨论,如果早一点疯狂讨论,思路其实不难推出来,因为给定的n其实是没什么作用,我们只要推出前m个字符串有多少个对称子串,最后会发现其实是满足规律的,可以发现,只要找到第一个i使得m+1<fibi,答案就是m-fib(i-2).画画图,打打表,就能发现了
代码:
#include <cstdio> #include <iostream> #include <cstring> //#include<cstdio> //const int mod=258280327; using namespace std; #define DIGIT 4 //四位隔开,即万进制 #define DEPTH 10000 //万进制 #define MAX 5000 //题目最大位数/4,要不大直接设为最大位数也行 typedef int bignum_t[MAX+1]; /************************************************************************/ /* 读取操作数,对操作数进行处理存储在数组里 */ /************************************************************************/ int read(bignum_t a,istream&is=cin) { char buf[MAX*DIGIT+1],ch ; int i,j ; memset((void*)a,0,sizeof(bignum_t)); if(!(is>>buf))return 0 ; for(a[0]=strlen(buf),i=a[0]/2-1; i>=0; i--) ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ; for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf); j<a[0]*DIGIT; buf[j++]='0'); for(i=1; i<=a[0]; i++) for(a[i]=0,j=0; j<DIGIT; j++) a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ; for(; !a[a[0]]&&a[0]>1; a[0]--); return 1 ; } void write(const bignum_t a,ostream&os=cout) { int i,j ; for(os<<a[i=a[0]],i--; i; i--) for(j=DEPTH/10; j; j/=10) os<<a[i]/j%10 ; } int comp(const bignum_t a,const bignum_t b) { int i ; if(a[0]!=b[0]) return a[0]-b[0]; for(i=a[0]; i; i--) if(a[i]!=b[i]) return a[i]-b[i]; return 0 ; } int comp(const bignum_t a,const int b) { int c[12]= { 1 } ; for(c[1]=b; c[c[0]]>=DEPTH; c[c[0]+1]=c[c[0]]/DEPTH,c[c[0]]%=DEPTH,c[0]++); return comp(a,c); } int comp(const bignum_t a,const int c,const int d,const bignum_t b) { int i,t=0,O=-DEPTH*2 ; if(b[0]-a[0]<d&&c) return 1 ; for(i=b[0]; i>d; i--) { t=t*DEPTH+a[i-d]*c-b[i]; if(t>0)return 1 ; if(t<O)return 0 ; } for(i=d; i; i--) { t=t*DEPTH-b[i]; if(t>0)return 1 ; if(t<O)return 0 ; } return t>0 ; } /************************************************************************/ /* 大数与大数相加 */ /************************************************************************/ void add(bignum_t a,const bignum_t b) { int i ; for(i=1; i<=b[0]; i++) if((a[i]+=b[i])>=DEPTH) a[i]-=DEPTH,a[i+1]++; if(b[0]>=a[0]) a[0]=b[0]; else for(; a[i]>=DEPTH&&i<a[0]; a[i]-=DEPTH,i++,a[i]++); a[0]+=(a[a[0]+1]>0); } /************************************************************************/ /* 大数与小数相加 */ /************************************************************************/ void add(bignum_t a,const int b) { int i=1 ; for(a[1]+=b; a[i]>=DEPTH&&i<a[0]; a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++); for(; a[a[0]]>=DEPTH; a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++); } /************************************************************************/ /* 大数相减(被减数>=减数) */ /************************************************************************/ void sub(bignum_t a,const bignum_t b) { int i ; for(i=1; i<=b[0]; i++) if((a[i]-=b[i])<0) a[i+1]--,a[i]+=DEPTH ; for(; a[i]<0; a[i]+=DEPTH,i++,a[i]--); for(; !a[a[0]]&&a[0]>1; a[0]--); } /************************************************************************/ /* 大数减去小数(被减数>=减数) */ /************************************************************************/ void sub(bignum_t a,const int b) { int i=1 ; for(a[1]-=b; a[i]<0; a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++); for(; !a[a[0]]&&a[0]>1; a[0]--); } void sub(bignum_t a,const bignum_t b,const int c,const int d) { int i,O=b[0]+d ; for(i=1+d; i<=O; i++) if((a[i]-=b[i-d]*c)<0) a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH ; for(; a[i]<0; a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++); for(; !a[a[0]]&&a[0]>1; a[0]--); } /************************************************************************/ /* 大数相乘,读入被乘数a,乘数b,结果保存在c[] */ /************************************************************************/ void mul(bignum_t c,const bignum_t a,const bignum_t b) { int i,j ; memset((void*)c,0,sizeof(bignum_t)); for(c[0]=a[0]+b[0]-1,i=1; i<=a[0]; i++) for(j=1; j<=b[0]; j++) if((c[i+j-1]+=a[i]*b[j])>=DEPTH) c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH ; for(c[0]+=(c[c[0]+1]>0); !c[c[0]]&&c[0]>1; c[0]--); } /************************************************************************/ /* 大数乘以小数,读入被乘数a,乘数b,结果保存在被乘数 */ /************************************************************************/ void mul(bignum_t a,const int b) { int i ; for(a[1]*=b,i=2; i<=a[0]; i++) { a[i]*=b ; if(a[i-1]>=DEPTH) a[i]+=a[i-1]/DEPTH,a[i-1]%=DEPTH ; } for(; a[a[0]]>=DEPTH; a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++); for(; !a[a[0]]&&a[0]>1; a[0]--); } void mul(bignum_t b,const bignum_t a,const int c,const int d) { int i ; memset((void*)b,0,sizeof(bignum_t)); for(b[0]=a[0]+d,i=d+1; i<=b[0]; i++) if((b[i]+=a[i-d]*c)>=DEPTH) b[i+1]+=b[i]/DEPTH,b[i]%=DEPTH ; for(; b[b[0]+1]; b[0]++,b[b[0]+1]=b[b[0]]/DEPTH,b[b[0]]%=DEPTH); for(; !b[b[0]]&&b[0]>1; b[0]--); } /**************************************************************************/ /* 大数相除,读入被除数a,除数b,结果保存在c[]数组 */ /* 需要comp()函数 */ /**************************************************************************/ void div(bignum_t c,bignum_t a,const bignum_t b) { int h,l,m,i ; memset((void*)c,0,sizeof(bignum_t)); c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1 ; for(i=c[0]; i; sub(a,b,c[i]=m,i-1),i--) for(h=DEPTH-1,l=0,m=(h+l+1)>>1; h>l; m=(h+l+1)>>1) if(comp(b,m,i-1,a))h=m-1 ; else l=m ; for(; !c[c[0]]&&c[0]>1; c[0]--); c[0]=c[0]>1?c[0]:1 ; } void div(bignum_t a,const int b,int&c) { int i ; for(c=0,i=a[0]; i; c=c*DEPTH+a[i],a[i]=c/b,c%=b,i--); for(; !a[a[0]]&&a[0]>1; a[0]--); } /************************************************************************/ /* 大数平方根,读入大数a,结果保存在b[]数组里 */ /* 需要comp()函数 */ /************************************************************************/ void sqrt(bignum_t b,bignum_t a) { int h,l,m,i ; memset((void*)b,0,sizeof(bignum_t)); for(i=b[0]=(a[0]+1)>>1; i; sub(a,b,m,i-1),b[i]+=m,i--) for(h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1; h>l; b[i]=m=(h+l+1)>>1) if(comp(b,m,i-1,a))h=m-1 ; else l=m ; for(; !b[b[0]]&&b[0]>1; b[0]--); for(i=1; i<=b[0]; b[i++]>>=1); } /************************************************************************/ /* 返回大数的长度 */ /************************************************************************/ int length(const bignum_t a) { int t,ret ; for(ret=(a[0]-1)*DIGIT,t=a[a[0]]; t; t/=10,ret++); return ret>0?ret:1 ; } /************************************************************************/ /* 返回指定位置的数字,从低位开始数到第b位,返回b位上的数 */ /************************************************************************/ int digit(const bignum_t a,const int b) { int i,ret ; for(ret=a[(b-1)/DIGIT+1],i=(b-1)%DIGIT; i; ret/=10,i--); return ret%10 ; } /************************************************************************/ /* 返回大数末尾0的个数 */ /************************************************************************/ int zeronum(const bignum_t a) { int ret,t ; for(ret=0; !a[ret+1]; ret++); for(t=a[ret+1],ret*=DIGIT; !(t%10); t/=10,ret++); return ret ; } void comp(int*a,const int l,const int h,const int d) { int i,j,t ; for(i=l; i<=h; i++) for(t=i,j=2; t>1; j++) while(!(t%j)) a[j]+=d,t/=j ; } void convert(int*a,const int h,bignum_t b) { int i,j,t=1 ; memset(b,0,sizeof(bignum_t)); for(b[0]=b[1]=1,i=2; i<=h; i++) if(a[i]) for(j=a[i]; j; t*=i,j--) if(t*i>DEPTH) mul(b,t),t=1 ; mul(b,t); } /************************************************************************/ /* 组合数 */ /************************************************************************/ void combination(bignum_t a,int m,int n) { int*t=new int[m+1]; memset((void*)t,0,sizeof(int)*(m+1)); comp(t,n+1,m,1); comp(t,2,m-n,-1); convert(t,m,a); delete[]t ; } /************************************************************************/ /* 排列数 */ /************************************************************************/ void permutation(bignum_t a,int m,int n) { int i,t=1 ; memset(a,0,sizeof(bignum_t)); a[0]=a[1]=1 ; for(i=m-n+1; i<=m; t*=i++) if(t*i>DEPTH) mul(a,t),t=1 ; mul(a,t); } #define SGN(x) ((x)>0?1:((x)<0?-1:0)) #define ABS(x) ((x)>0?(x):-(x)) int read(bignum_t a,int&sgn,istream&is=cin) { char str[MAX*DIGIT+2],ch,*buf ; int i,j ; memset((void*)a,0,sizeof(bignum_t)); if(!(is>>str))return 0 ; buf=str,sgn=1 ; if(*buf=='-')sgn=-1,buf++; for(a[0]=strlen(buf),i=a[0]/2-1; i>=0; i--) ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ; for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf); j<a[0]*DIGIT; buf[j++]='0'); for(i=1; i<=a[0]; i++) for(a[i]=0,j=0; j<DIGIT; j++) a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ; for(; !a[a[0]]&&a[0]>1; a[0]--); if(a[0]==1&&!a[1])sgn=0 ; return 1 ; } struct bignum { bignum_t num ; int sgn ; public : inline bignum() { memset(num,0,sizeof(bignum_t)); num[0]=1 ; sgn=0 ; } inline int operator!() { return num[0]==1&&!num[1]; } inline bignum&operator=(const bignum&a) { memcpy(num,a.num,sizeof(bignum_t)); sgn=a.sgn ; return*this ; } inline bignum&operator=(const int a) { memset(num,0,sizeof(bignum_t)); num[0]=1 ; sgn=SGN (a); add(num,sgn*a); return*this ; } ; inline bignum&operator+=(const bignum&a) { if(sgn==a.sgn)add(num,a.num); else if (sgn&&a.sgn) { int ret=comp(num,a.num); if(ret>0)sub(num,a.num); else if(ret<0) { bignum_t t ; memcpy(t,num,sizeof(bignum_t)); memcpy(num,a.num,sizeof(bignum_t)); sub (num,t); sgn=a.sgn ; } else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ; } else if(!sgn) memcpy(num,a.num,sizeof(bignum_t)),sgn=a.sgn ; return*this ; } inline bignum&operator+=(const int a) { if(sgn*a>0)add(num,ABS(a)); else if(sgn&&a) { int ret=comp(num,ABS(a)); if(ret>0)sub(num,ABS(a)); else if(ret<0) { bignum_t t ; memcpy(t,num,sizeof(bignum_t)); memset(num,0,sizeof(bignum_t)); num[0]=1 ; add(num,ABS (a)); sgn=-sgn ; sub(num,t); } else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ; } else if (!sgn)sgn=SGN(a),add(num,ABS(a)); return*this ; } inline bignum operator+(const bignum&a) { bignum ret ; memcpy(ret.num,num,sizeof (bignum_t)); ret.sgn=sgn ; ret+=a ; return ret ; } inline bignum operator+(const int a) { bignum ret ; memcpy(ret.num,num,sizeof (bignum_t)); ret.sgn=sgn ; ret+=a ; return ret ; } inline bignum&operator-=(const bignum&a) { if(sgn*a.sgn<0)add(num,a.num); else if (sgn&&a.sgn) { int ret=comp(num,a.num); if(ret>0)sub(num,a.num); else if(ret<0) { bignum_t t ; memcpy(t,num,sizeof(bignum_t)); memcpy(num,a.num,sizeof(bignum_t)); sub(num,t); sgn=-sgn ; } else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ; } else if(!sgn)add (num,a.num),sgn=-a.sgn ; return*this ; } inline bignum&operator-=(const int a) { if(sgn*a<0)add(num,ABS(a)); else if(sgn&&a) { int ret=comp(num,ABS(a)); if(ret>0)sub(num,ABS(a)); else if(ret<0) { bignum_t t ; memcpy(t,num,sizeof(bignum_t)); memset(num,0,sizeof(bignum_t)); num[0]=1 ; add(num,ABS(a)); sub(num,t); sgn=-sgn ; } else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0 ; } else if (!sgn)sgn=-SGN(a),add(num,ABS(a)); return*this ; } inline bignum operator-(const bignum&a) { bignum ret ; memcpy(ret.num,num,sizeof(bignum_t)); ret.sgn=sgn ; ret-=a ; return ret ; } inline bignum operator-(const int a) { bignum ret ; memcpy(ret.num,num,sizeof(bignum_t)); ret.sgn=sgn ; ret-=a ; return ret ; } inline bignum&operator*=(const bignum&a) { bignum_t t ; mul(t,num,a.num); memcpy(num,t,sizeof(bignum_t)); sgn*=a.sgn ; return*this ; } inline bignum&operator*=(const int a) { mul(num,ABS(a)); sgn*=SGN(a); return*this ; } inline bignum operator*(const bignum&a) { bignum ret ; mul(ret.num,num,a.num); ret.sgn=sgn*a.sgn ; return ret ; } inline bignum operator*(const int a) { bignum ret ; memcpy(ret.num,num,sizeof (bignum_t)); mul(ret.num,ABS(a)); ret.sgn=sgn*SGN(a); return ret ; } inline bignum&operator/=(const bignum&a) { bignum_t t ; div(t,num,a.num); memcpy (num,t,sizeof(bignum_t)); sgn=(num[0]==1&&!num[1])?0:sgn*a.sgn ; return*this ; } inline bignum&operator/=(const int a) { int t ; div(num,ABS(a),t); sgn=(num[0]==1&&!num [1])?0:sgn*SGN(a); return*this ; } inline bignum operator/(const bignum&a) { bignum ret ; bignum_t t ; memcpy(t,num,sizeof(bignum_t)); div(ret.num,t,a.num); ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*a.sgn ; return ret ; } inline bignum operator/(const int a) { bignum ret ; int t ; memcpy(ret.num,num,sizeof(bignum_t)); div(ret.num,ABS(a),t); ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*SGN(a); return ret ; } inline bignum&operator%=(const bignum&a) { bignum_t t ; div(t,num,a.num); if(num[0]==1&&!num[1])sgn=0 ; return*this ; } inline int operator%=(const int a) { int t ; div(num,ABS(a),t); memset(num,0,sizeof (bignum_t)); num[0]=1 ; add(num,t); return t ; } inline bignum operator%(const bignum&a) { bignum ret ; bignum_t t ; memcpy(ret.num,num,sizeof(bignum_t)); div(t,ret.num,a.num); ret.sgn=(ret.num[0]==1&&!ret.num [1])?0:sgn ; return ret ; } inline int operator%(const int a) { bignum ret ; int t ; memcpy(ret.num,num,sizeof(bignum_t)); div(ret.num,ABS(a),t); memset(ret.num,0,sizeof(bignum_t)); ret.num[0]=1 ; add(ret.num,t); return t ; } inline bignum&operator++() { *this+=1 ; return*this ; } inline bignum&operator--() { *this-=1 ; return*this ; } ; inline int operator>(const bignum&a) { return sgn>0?(a.sgn>0?comp(num,a.num)>0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<0:0):a.sgn<0); } inline int operator>(const int a) { return sgn>0?(a>0?comp(num,a)>0:1):(sgn<0?(a<0?comp(num,-a)<0:0):a<0); } inline int operator>=(const bignum&a) { return sgn>0?(a.sgn>0?comp(num,a.num)>=0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<=0:0):a.sgn<=0); } inline int operator>=(const int a) { return sgn>0?(a>0?comp(num,a)>=0:1):(sgn<0?(a<0?comp(num,-a)<=0:0):a<=0); } inline int operator<(const bignum&a) { return sgn<0?(a.sgn<0?comp(num,a.num)>0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<0:0):a.sgn>0); } inline int operator<(const int a) { return sgn<0?(a<0?comp(num,-a)>0:1):(sgn>0?(a>0?comp(num,a)<0:0):a>0); } inline int operator<=(const bignum&a) { return sgn<0?(a.sgn<0?comp(num,a.num)>=0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<=0:0):a.sgn>=0); } inline int operator<=(const int a) { return sgn<0?(a<0?comp(num,-a)>=0:1): (sgn>0?(a>0?comp(num,a)<=0:0):a>=0); } inline int operator==(const bignum&a) { return(sgn==a.sgn)?!comp(num,a.num):0 ; } inline int operator==(const int a) { return(sgn*a>=0)?!comp(num,ABS(a)):0 ; } inline int operator!=(const bignum&a) { return(sgn==a.sgn)?comp(num,a.num):1 ; } inline int operator!=(const int a) { return(sgn*a>=0)?comp(num,ABS(a)):1 ; } inline int operator[](const int a) { return digit(num,a); } friend inline istream&operator>>(istream&is,bignum&a) { read(a.num,a.sgn,is); return is ; } friend inline ostream&operator<<(ostream&os,const bignum&a) { if(a.sgn<0) os<<'-' ; write(a.num,os); return os ; } friend inline bignum sqrt(const bignum&a) { bignum ret ; bignum_t t ; memcpy(t,a.num,sizeof(bignum_t)); sqrt(ret.num,t); ret.sgn=ret.num[0]!=1||ret.num[1]; return ret ; } friend inline bignum sqrt(const bignum&a,bignum&b) { bignum ret ; memcpy(b.num,a.num,sizeof(bignum_t)); sqrt(ret.num,b.num); ret.sgn=ret.num[0]!=1||ret.num[1]; b.sgn=b.num[0]!=1||ret.num[1]; return ret ; } inline int length() { return :: length(num); } inline int zeronum() { return :: zeronum(num); } inline bignum C(const int m,const int n) { combination(num,m,n); sgn=1 ; return*this ; } inline bignum P(const int m,const int n) { permutation(num,m,n); sgn=1 ; return*this ; } }; bignum a[2000],m,nn; bignum mod; void init() { a[0] = 1; a[1] = 1; for(int i=2; i<=1000; ++i) { a[i] = a[i-1] + a[i-2]; } } int num[]= {0,1,0,1,1,2}; int main() { mod=258280327; int t,n; init(); scanf("%d",&t); while(t--){ scanf("%d",&n); cin>>m; if(n==1&&m==1){//注意! puts("0"); continue; } int h1=1; nn=1; int f=0; while(nn<5){ if(nn==m){ printf("%d\n",num[h1]); f=1; } h1++; nn=nn+1; } if(f) continue; f=0; for(int i=1; i<=1001; i++){ if(a[i]==m){ h1=i; break; } else if(a[i]>m){ if(a[i]==m+1){ cout<<(a[i-2]-1)%mod<<endl;; f=1; } h1=i-1; break; } } if(f) continue; cout<<(m-a[h1]+a[h1-2])%mod<<endl; } return 0; }
【题意】RT:
1 2 5 3
SECOND BIGGER FIRST BIGGER
#include <bits/stdc++.h> using namespace std; map <int ,int >val; void init(){ val[1] = 1400; val[2] = 2300; val[3] = 520; val[4] = 899; val[5] = 800; val[6] = 1086; val[7] = 1402; val[8] = 1313; val[9] = 1681; val[10] = 2080; val[11] = 495; val[12] = 737; val[13] = 577; val[14] = 786; val[15] = 1011; val[16] = 999; val[17] = 1251; val[18] = 1520; val[35] = 1139; val[36] = 1350; val[53] = 1008; val[54] = 1170; val[85] = 890; val[86] = 1037; } int main() { init(); int x,y; while(~scanf("%d %d",&x,&y)){ int lx=val[x]; int ly=val[y]; if(lx>ly) puts("FIRST BIGGER"); else puts("SECOND BIGGER"); } return 0; }先发比赛的时候做出的,没做出的明天补上~~