筛素数表文稿_第1页
筛素数表文稿_第2页
筛素数表文稿_第3页
筛素数表文稿_第4页
筛素数表文稿_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

筛素数筛素数 反素数序 反素数 素数判 快速幂取 辗转相除法求 欧拉函 拓展欧几里 Miller_rabin+ 高斯消 矩阵快速 组合数学八皇 组合数学错 组合数学斐波那 组合数学卡特兰 组合数学立方之 组合数学系列递 组合数学系列容斥+逆 组合数学系列鸽巢原 组合数学系列置换 组合数学Polya定理与Burnside引 组合数学盒子装小球问 费马小定 异面直线公垂线的垂足坐标计算公式推 点到直线距 凸包散点求三角形最大面 dp问题 dp问题 dp问题01背 dp问题完全背 dp问题多重背 dp问题最大括号匹 dp问题区间最大字段和 dp问题树形dp举 dp问题状压dp举 线段树系列经典问 字符串KMP算 回文子串O(n)manacher算 图论最短 图论最小生成 图论最大 图论匈牙利算法二分图匹 经典博弈纳什博 java快速 2筛素数表constintmaxn2600;//大小自定义,非素数均为trueboolvis[maxn];筛素数表constintmaxn2600;//大小自定义,非素数均为trueboolvis[maxn];void{memset(vis,0,sizeof(vis))vis[0]=true;vis[1]=for(inti=2;i*i<maxn;i++)if(!vis[i])for(intj=i*i;j<maxn;j+=i)vis[j]=true;}反素问题描n,n+1,…,mn1m10,1,3,5,4,26,9,7,8,就是一个反素数序列。它也是按字典顺序的第一个这样的序列。我们可以扩展此定义,度d反素数序列是相邻d个整数之和为合数的这种序列。所以,之前序列是一个度2反素数序列,但是不是度3的,因为子列5,4,2和为11。这些数按字典顺31,3,5,46,2,10879输入格输入包含多组输入集。每个输入集包含同一行的三个整数,nmd。n,md≤n<m≤1000和2≤d≤10。以一行000(此行不需处理)代表输入的结束。3对于每个输入集,输出一行以逗号隔开的整数列,此整数列组成对于每个输入集,输出一行以逗号隔开的整数列,此整数列组成一个度反素数序列(不要入任何空格并且输出不要跨越多行)如果不存在反素数序列,则输出“Noanti-primesequenceexist输入样121315406000输出样Noanti-primesequenceexists.usingnamespacestd;constintMAXP=1100000;boolisPrime[MAXP];intinta[1005],ans[1005],n,m,d,OK;boolvst[1005];voidprimeList()memset(isPrime,true,sizeof(isPrime));isPrime[1]=false;for(inti=2;i<=MAXP;{ifprime[++prime[0i;/prime[0]0for(intj=1,k;(j<=prime[0])&&(k=i*prime[j])<={isPrime[k]=false;if(i%prime[j]==0)}}}++ji4boolcheck(intnum)boolcheck(intnum){intsum=ans[num],i,k;if(num-d+1>=1)k=num-d+k=for(i=num-1;i>=k;i--{sum+=ans[i];return1;}return}voiddfs(intpos)if(check(pos-1))if(pos==m-n+{OK=}for(inti=n;i<=m;{if(!vst[i]){ans[pos]=i;vst[i]=1;dfs(pos+vst[i]=0;if(OK)}}}个数intmain()intk;while(scanf("%d%d%d",&n,&m,&d))if(n==0&&m==0&&d==k=1;for(inti=n;i<=m;i++)a[k++]=i;memset(vst,0,memset(ans,0,OK=if(OK==0){printf("Noanti-primesequence5}for(inti=}for(inti=1;i<=m-n;i++)printf("%d,",ans[i]);printf("%d\n",ans[m-n+}return}反素对于任何正整数x,其约数的个数记做g(x)。例如g(1)=1,g(6)=4如果某个正整数x满足:对于任意i(0ix),都有g(i)g(x),则称x而反素数表就是对应上面反素数所建立的一张表,这张表好处多多,例如给你一个n的找出1~~n范围内,谁的因子数之和最多!usingnamespace{inti,j;{{}}intmax=0;{{}}{6{}}return}以上为反素数表{}}return}以上为反素数表,下面为对应的因子个数,如1-2中,2的因子个数最多,有21-4中,4为3个;1-664个。1-1164个。1-19中,126个。反素数的搜任给一个数n,可以得到1~n中,最大的SampleInputSampleOutputCase#1:840int64int64voiddfs(int64cur,int64cnt,int64power,int64{int64i;{}int64p=prime[sub];{7}}int{intt,T;{printf("Case#%d:}return}素}}int{intt,T;{printf("Case#%d:}return}素数判定intisprime(long//传入待判定数intisprime(long{return0;longlongj=3;while(j<=(long{}return}快速longlongmodular(longlonglonglongmodular(longlonglonglong{longlongd=1,t=a;{}return}8publicstaticintgcd(intpublicstaticintgcd(inta,intbreturnb==0?a:gcd(b,a%}//计算a,b的最大公约数,返回1,LCM最小intLCM(intm,int{intm1=m;intn1=n;inttemp;while(n1%m1!={temp=n1%m1;n1=m1;m1=}intans=n/m1*m;returnans;}//计算m,n的最小公倍数欧拉函数定义:φφ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-其中p1,p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)求出m的欧拉函数值phi[m],可知区间[1,mphi[m]个数与m1)。单项欧拉函数:publicstaticintn){intres=for(inti=2;i<Math.sqrt(n);{if(n%i==0)res=res/i*(i-1);while(n%i==0)n=n/}}if(n>res=res/n*(n-1);returnres;}各项欧拉函数:intphinewint[1000005];/for(inti2;i1000000;iif(phi[i]==0){9for(intj=i;j<=1000000;j+={for(intj=i;j<=1000000;j+={if(phi[j]==0)phi[j]=j;phi[j]=phi[j]/i*(i-}}}拓展欧几里,x=(x0*n/gcd(a,b))%b;if(x<0)通解可以表示为x=x0+b/d*ty=y0-a/dint64x,dextend_gcd(a,b,x,y);/int64extend_gcd(int64a,int64b,int64&x,int64&y)int64t,ret;if(b==0){x=y=return}ret=extend_gcd(b,a%b,x,===t-a/b*return}//返回值为a,b两系数的最大公约数,计算出一组解Miller_rabin判素数法,pollard_rho分解质例举三道模版题题意:判断所有质数i<=k,2^i-1是否是质数,不是的话就要将它分解质因数输出来。SampleInputSample23*89=2047=(2^11)-47*178481=8388607=(2^23)-233*1103*2089=536870911=(2^29)-usingnamespacelonglongfactor[100],fac_top=usingnamespacelonglongfactor[100],fac_top=-//计算两个数的longlongran[1000000],ID;longlongRand(){returnrand();}longlonggcd(longlong{longlongc;{}return}longlongmuti_mod(longlong{longlongexp=a%n,res=0;{{res+=exp;if(res>n)res-=n;}exp<<=1;exp-=b,longlong}return}longlongmod_exp(longlong{longlongexp=a%m,longp,longlong{exp=muti_mod(exp,exp,m);}return}//miller-rabin法测试素数,{exp=muti_mod(exp,exp,m);}return}//miller-rabin法测试素数,time测试次boolmiller_rabin(longlongn,{if(n==2)returnlonglonga,u=n-1,x,y;intt=0;{}{axi=0;i<times;Rand()%(n-1)+mod_exp(a,u,for(intj=0;j<t;{y=muti_mod(x,x,if(y==1&&x!=1&&x!=returnfalse;x=}if(y!=1)return)}return}longlongpollard_rho(longlongn,int{longlongx,y,d,i=1,k=2;x=Rand()%(n-1)+1;y=x;{x=(muti_mod(x,x,n)+c)%n;d=gcd(y-x,n);if(1<d&&if(1<d&&d<n)returnd;if(y==if(i==k){y=x;k<<=}}}voidfindFactor(longlong{if(miller_rabin(n,6)){factor[++fac_top]=n;}longlongp=n;while(p>=n)p=pollard_rho(p,k--);}{for(inttt=0;tt<1000000;tt++)intk;{for(inti=11;i<=k;{longlongn=(1ll<<i)-1;{for(intj=0;j<fac_top;j++)printf("%lld*printf("%lld=%lld=(2^%d)printf("%lld=%lld=(2^%d)-}}}return}2.给出两个数a,b的最大公约数,最小公倍数,输出最小的3601215usingnamespacestd;longlong=-//计算两个数的longlonggcd(longlong{returnb;longlongc;{}return}longlongmuti_mod(longlong{longlongexp=a%n,res=0;{{res+=exp;if(res>n)res-=n;}exp<<=1;exp-=long}return}longlongmod_exp(long}return}longlongmod_exp(longlonga,longlongp,long{longlongexp=a%m,res=1;{exp=muti_mod(exp,exp,m);}return}//miller-rabin法测试素数,time测试boolmiller_rabin(longlongn,long{longlonga,u=n-1,x,y;intt=0;}for(int{a=rand()%(n-1)+1;x=mod_exp(a,u,n);for(intj=0;j<t;j++){y=muti_mod(x,x,if(y==1&&x!=1&&x!=n-1)returnfalse;//mustnotx=}if(y!=1)return}return}longlongpollard_rho(longlongn,int{//找出一个longlongx,y,d,i=1,k=2;x=rand()%(n-1)+1;y=x;{x=(muti_mod(x,x,n)+c)%n;d=gcd(y-x,n);if(1x=(muti_mod(x,x,n)+c)%n;d=gcd(y-x,n);if(1<d&&d<n)returnif(y==x)if(i==k){y=x;k<<=}return}}voidfindFactor(longlongn,int{//二分找出所有质因子,存入factorif(miller_rabin(n,10)){factor[++fac_top]=n;}longlongp=n;while(p>=n)p=pollard_rho(p,k--);//k值变化,防止死循}longlonga[1000];longlongm,minx,ans;intcmp(constvoid*a,const*b){return*(longlong*)a-*(longvoiddfs(longlongs,longlongnum,longlong{{}}}voidlonglongi;{}{}longlongi;{}{}}int{longlongs,t,n;{{}fac_top=-1;if(ans>n/ans)ans=n/ans;}return}Sample25Sample#include<cstdio>#include<ctime>#include<cstring>#include<iostream>constintS=20;usingnamespacestd;typedeflonglongLL;#definemaxn10000#include<cstring>#include<iostream>constintS=20;usingnamespacestd;typedeflonglongLL;#definemaxn10000inttot;muti_mod(LLa,LLb,LL LLret=0;ifif(ret>=c)ret-if(a>=c)a-=c;}return}pow_mod(LLx,LLn,LLmod){//返回x^nmodc非递归(n==1)returnx%mod;intbit[64],k=0;while(n){}LLfor(k=k--){if(bit[k]==1)}return}boolcheck(LLa,LLn,LLx,LLt){//a为基,n-1=x*2^t,检n是不是合for(inti=1;i<=t;i++){if(ret==1&&last!=1&&last!=n-1)return1;}if(ret!=1)return1;return0;}boolMiller_Rabin(LLLLx=n-while((x&1)==0)x>>=1,t++;boolflag=1;if(t>=1&&LLx=n-while((x&1)==0)x>>=1,t++;boolflag=1;if(t>=1&&(x&1)==1){for(intk=0;k<S;k++){if(check(a,n,x,t)){flag=1;break;}}}if(!flag||n==2)return}gcd(LLa,LLif(a==0)returnif(a<0)returngcd(-a,b);while(b){LLt=a%b;a=b;}returnPollard_rho(LLx,LLwhile(1){LLd=gcd(y-x0,x);ifd!=x){return}if(y==x0)returnx;if(i==k){}}}voidfindfac(LLn){//递归进行质因iffactor[tot++]=n;}LLwhile(p>=n)p=Pollard_rho(p,rand()}%(n-intintt;while(t--LLif(!Miller_Rabin(n))printf("Prime\n");tot=0;LLans=n;for(inti=0;i<tot;i++)ansLLif(!Miller_Rabin(n))printf("Prime\n");tot=0;LLans=n;for(inti=0;i<tot;i++)ans=min(ans,factor[i]);}}}数,数到m的那个人又出列;//n=9,m=publicclassMain{publicstaticvoidmain(String[]{Scannerintf[]=newint[n+1];for(int}个退出的人的序号:注意程序只关注最后f[n],f[1~n-1]为中间程序无意义。}}//38657241//386572411importjava.util.Scanner;publicclassMainpublicstaticvoidmain(String[]{Scannerscan=newn=scan.nextInt();//n个人围成环,标号1~nm=scan.nextInt();//报到m号被杀死f[]=newint[n+1];i=2;i<=n;i++){}intans=(k-m+1+f[n])%Sample3405classMainstaticvoidmain(String[]args)Scannerscan=newScanner(System.in);while(scan.hasNext()){intk=scan.nextInt();if(k==0)elseelse1358657,2504881,System.out.println(a[k-}}}}importpublicclassMainpublicstaticmain(String[]{Scannerscan=newintresult[]=newint[14];intk=scan.nextInt();while(k!=0){for(intj=1;;{intm=j*(k+pp=rest=2*(inti=0;i<k;i++)(p+m-1)%rest;{if(p<k)}if(rest==}{p=rest=2*for(inti=0;i<k;i++)p=(p+m-1)%rest;if(p<k)}if(rest==k){}}}k=}}}}}}k=}}}结论m=5。题目意思大概n个小孩围成一个圈,每个小孩手里有张卡片,记录着一个数字。开始从第k个孩子,该孩子离开圈子,然后告诉别人他手里的数字,接下来便从位于该孩子数之和。例如第6个跳出的孩子能得到(1,2,3,6)四个糖果。usingnamespace#defineL(rt)(rt<<1)#defineR(rt)(rt<<1|1)constintusingnamespace#defineL(rt)(rt<<1)#defineR(rt)(rt<<1|1)constintintstructint date{intcharvoidbuild(intl,intr,intrt){tree[rt].l=l;returnintmid=(l+r)>>1;}update(intkey,intrt){tree[rt].sum--;returntree[rt].l;returnupdate(key-}voidfor(inti=1;i<=n;i++){}}}}}intinti,k,mod;intpos=0;if(boy[pos].val>0)//kk}printf("%s}return}usingnamespacestd;constintintx[MAXN];//intx[MAXN];//inlineintgcd(inta,int{intt;{}return}inlineintlcm(inta,int{}var+1,分别为0到Gauss(intequ,int{for(inti=0;i<=var;{}for(k=0;k<equ&&col<{枚举当前处理的行for(i=k+1;i<equ;{}{for(j=k;j<var+1;j++)}{}for(i=k+1;i<equ;{枚举要删去的行.{LCM=lcm(abs(a[i][col]),abs(a[k][col]));ta=LCM/abs(a[i][col]);tb=for(j=col;j<var+1;{a[i][j]=a[i][j]*ta-}}}}for(i=k;i<equ;{if(a[i][col]!=0)return-}这样的行,即说明没有形成严格的上三角阵if(k<var){if(k<var){for(i=k-1;i>=0;i--){i行一定不会是(0,00)的情况,因为这样的行是在第k行到第equ行.i行一定不会是(00aa0的情况,free_x_num0用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.for(j=0;j<var;{free_index}(a[i][j]!=0&&free_x[j])free_x_num++,(free_x_num1continue;无法求解出确定的变元.变元,且该变元是确定的temp=for(j=0;j<var;{}free_x[free_index]=0;//该变元是确定的.}returnvarkvark个}Xn-1Xn-2for(i=var-1;i>=0;i--{temp=for(j=i+1;j<var;{if(a[i][j]!=0)temp-=a[i][j]*}if(tempa[i][i0return2说明有浮点数解,但无整数解.x[i]=temp/a[i][i];}return}int{inti,j;while(scanf("%d%d",&equ,&var)int{inti,j;while(scanf("%d%d",&equ,&var)!={memset(a,0,sizeof(a));for(i=0;i<equ;i++){for(j=0;j<var+1;{scanf("%d",}}intfree_num=if(free_num1printf("无解elseif(free_num>0){printf("无穷多解自由变元个数为%d\n"free_num);for(i=0;i<var;i++){i+if(free_x[iprintf("x%d是不确定的\n",elseprintf("x%d:%d\n",i+1,x[i]);}}{for(i=0;i<var;{printf("x%d:%d\n",i+}}}return}矩阵快速幂#includetypedef{int64int64powermod(int64x,int64int64int64powermod(int64x,int64n,int64p)//{int64res=1;{x=(x*x)%p;}return}Matrixmulti(Matrixx,Matrixy,int64p)//{inti,j,k;int64sum;for(i=0;i<2;i++)for(j={sum=for(k=0;k<2;k++)res.matrix[i][j]=sum%p;}return}MatrixMat_powermod(Matrixx,int64n,int64p)//x,n次幂,p{inti,j;for(j=0;j<2;j++){}{x=multi(x,x,p);}returnx=multi(x,x,p);}return}int{int64int64int64power,result;Matrixres;{keep1=(powermod(a,(p-1)/2,p)+1)%p;{res.matrix[0][0]=res.matrix[0][1]=res.matrix[1][0]=res.matrix[1][1]=power=(res.matrix[0][0]+res.matrix[0][1])%(p-}res.matrix[0][1]=(2*a*b)%p;res.matrix[1][0]=2%p;res.matrix[1][1]=(a+b)%p;result=1;result=(result*keep1)%p;}return} 当n>=k1122112323311223.1235813f(1)=1f(2)=1;f(n)=f(n-1)+f(n-2)atalan例如n=5时,有5种剖分方法。publicclassMain{publicstaticvoidmain(String[]Scannerscan={longf[]=new===for(inti=4;i===for(inti=4;i<=10000;i++){j++for(intj=2;j<=i-1;){f[i]+=f[j]*f[i-j+}}while{intn=}}1234511125SampleinputOutputforsampleinput310=1^3+1^3+…..+1^3;10=1^3+1^3+2^3importpublicclassuva11137intmaxn=dp[]=newvoid{dp[0]=for(inti=1;intt=ii<=21;i++)i*for(intj=t;j<maxn;j++)dp[j]+=dp[j-}}}publicstaticvoidmain(String[]args)Scannerscan=newScanner(System.in);while(scan.hasNext()){intn=scan.nextInt();}}}组合Scannerscan=newScanner(System.in);while(scan.hasNext()){intn=scan.nextInt();}}}组合数学中系列问题B-ConnectedSampleSample112340ForeachtestcaseoutputtheansweronasingleTheinputcontainsseveraltestcases.Eachtestcasecontainsanintegern,denotingthenumberofvertices.Youmayassumethat1<=n<=50.Thelasttestcaseisfollowedbyonezero.AnundirectedgraphisasetVofverticesandasetofE∈{V*V}edges.Anundirectedgraphisconnectedifandonlyifforeverypair(u,v)ofvertices,uisreachablefromv.Youaretowriteaprogramthattriestocalculatethenumberofdifferentconnectedundirectedgraphwithnvertices.Forexample,thereare4differentconnectedundirectedgraphswith3方案数为2^(C(n-k-1,2)),所以这样的方案数共有C(n-1,k)*F(k+1)*2^(C(n-k-1,2))种。这种思路的优点在于简单明了,但是缺点在于编程复杂,要算高精度的加、减、乘,2的幂也考虑拿1时点2的情况,设此时2所在连通块k各点,这k个点以及剩下的n-k个分别处在一个连通块中,其方案数为F(k)*F(n-k),点需在除去点2的点中k-1个点成连通块,故方案数为C(n-2,k-1),而这总共个点与剩下除去点n-k-1个点必须2^k-1,故这样的情才能连通,即这k个点与点1至少有1条边连通,这样的方案数F(k)*F(n-k)*C(n-2,k-1)*(2^k-1)种。担,只需要高精度加和乘,2的幂只到50。我的程序就是靠思路二解决的。classMainpublicstaticvoidmain(String[]args)Scannerscan=new=newBigInteger[51];f[1]=BigInteger.valueOf(1);f[2]=for(inti=3;i<=50;i++){for(intj=1;j<i;j++){f[i]=f[i].add(f[j].multiply(f[i-j]).multiply(C(i-}}intn=scan.nextInt();while(n!=0){14n=}}publicstaticBigIntegerC(longx,longy)forn=}}publicstaticBigIntegerC(longx,longy)for(intc====1;p<=x;p++)a=if(p==b=if(p==x-y)c=a;}return}}A-TheBossonSampleForeachtestcase,outputanintegerindicatingthemoneythebosscansave.Becausetheanswerissolarge,pleasemoduletheanswerwith1,000,000,007.Case1:Case2:ThefirstlinecontainsanintegerTindicatingthenumberoftestcases.(1 1000)Eachtestcase,thereisonlyoneintegern,indicatingthenumberofemployeesinACM.(1 OnMars,thereisahugecompanycalledACM(AhugeCompanyonMars),andit'sownedbyayoungerboss.DuetonomoonsaroundMars,theemployeescanonlygetthesalariesper-year.arenemployeesinACM,andit'stimeforthemtogetsalariesfromtheirboss.Allemployeesarenumberedfrom1ton.Withtheunknownreasons,iftheemployee'sworknumberisk,hecangetk4Marsdollarsthisyear.SotheemployeesworkingfortheACMareveryrich.BecausethenumberofemployeesissolargethatthebossofACMmustdistributetoomuchmoney,hewantstofirethepeoplewhoseworknumberisco-primewithnnextyear.Nowthebosswantstoknowhowmuchhewillsaveafterthedismissal.Sample1~n中与n4次方之和,即Sample1~n中与n4次方之和,即S=a1^4+a2^4+……;a1,a2……且与n则1=1;;ab≡1(modmbam逆,记作amax≡1(modm)的解.做辗转相除法求得整数b,k5b+7k=1,b57逆计算如下:7=5+2,5=2×2+1.245回代1=5-2×2=5-2×(7-53×5-2回代1=5-2×2=5-2×(7-53×5-2×7,5^做辗转相除法求得整数b,k21b+73k=1,则b2173逆21=10*2+1回代1=21-21^-PROB:HDUusingnamespacestd;LL//30MODb){LLret=1;}return}LLans=n;returnans;}LLans=n;returnans;LLans=n;returnans;}intvoidPrime(){ for(inti=2;i<=10000;i++){}}void//30MOD}n){LLi=idx;i<fact.size();i++){tret=((ret-}}int}LLsum=((Sum(n)-}return}G-FindaSamplereturn}G-FindaSampleSampleN个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解,随意输出一组即可。若不存在,输出0。223512341Incaseyourprogramdecidesthatthetargetsetofnumberscannotbefounditshouldprinttotheoutputthesinglenumber0.Otherwiseitshouldprintthenumberofthechosennumbersinthefirstlinefollowedbythechosennumbersthemselves(onaseparatelineeach)inarbitraryorder.Iftherearemorethanonesetofnumberswithrequiredpropertiesyoushouldprinttotheoutputonlyone(preferablyyourfavorite)ofthem.ThefirstlineoftheinputcontainsthesinglenumberN.EachofnextNlinescontainsonenumberfromthegivenset.TheinputcontainsNnatural(i.e.positiveinteger)numbers(N<=10000).Eachofthatnumbersisnotgreaterthan15000.Thisnumbersarenotnecessarilydifferent(soitmayhappenthattwoormoreofthemwillbeequal).Yourtaskistochooseafewofgivennumbers(1<=few<=N)sothatthesumofchosennumbersismultipleforN(i.e.N*k=(sumofchosennumbers)forsomenaturalnumberk).如果余数出现0,自然就是n的倍数。也就是说,n个数中一定存如果余数出现0,自然就是n的倍数。也就是说,n个数中一定存在一些数的和是n的倍数。本题的思路是从第一个数开始一次求得前i(iN)项的和关于N的余数sum,并依次记sum0;则从第一项到第isum在前边已经出现过,假设在第j(j<i)项出现sumj+1项到第iclassMainlonga[]=newlong[16000];longsum[]=newlong[16000];staticvoidmain(String[]args)throws{}PrintWriterstaticvoidrun()throwsIOException=newStreamTokenizer(newBufferedReader(newInputStreamReader(System.in)));out=newPrintWriter(new}publicstaticlongnextLong()throwsreturn(int)in.nval;}{publicstaticvoidsolve()throwsIOExceptionlongn=booleanflag=sum[0]=for(inti=1;i<=n;i++)a[i]=}for(inti=1;i<=n;i++)sum[i]=(sum[i-1]+a[i])%n;if(sum[i]==0){for(intk=1;k<=i;}}elsefor(intj=1;j<i;{if(sum[i]==sum[j])out.println(i-for(intk=j+1;k<=i;flag=true;}}}if}}}TimeLimit:2000MSMemoryLimit:65536KB64bitIOFormat:%I64d&EveryyearthereisthesameproblematHalloween:Eachneighbourisonlywillingtogiveacertaintotalnumberofsweetsonthatday,nomatterhowmanychildrencallonhim,soitmayhappenthatachildwillgetnothingifitistoolate.Toavoidconflicts,thechildrenhavedecidedtheywillputallsweetstogetherandthendividethemevenlyamongthemselves.Fromlastyear'sexperienceofHalloweentheyknowhowmanysweetstheygetfromeachneighbour.Sincetheycaremoreaboutjusticethanaboutthenumberofsweetstheyget,theywanttoselectasubsetoftheneighbourstovisit,sothatinsharingeverychildreceivesthesamenumberofsweets.Theywillnotbesatisfiediftheyhaveanysweetsleftwhichcannotbedivided.Yourjobistohelpthechildrenandpresentasolution.TheinputcontainsseveraltestThefirstlineofeachtestcasecontainstwointegerscandn(1≤c≤n≤100000),thenumberofchildrenandthenumberofneighbours,respectively.Thenextlinecontainsnspaceseparatedintegersa1,...,an(1≤ai≤100000),whereairepresentsthenumberofsweetsthechildrengetiftheyvisitneighbouri.ThelasttestcaseisfollowedbytwoForeachtestcaseoutputonelinewiththeindicesoftheneighboursthechildrenshouldselect(here,indexicorrespondstoneighbouriwhogivesatotalnumberofaForeachtestcaseoutputonelinewiththeindicesoftheneighboursthechildrenshouldselect(here,indexicorrespondstoneighbouriwhogivesatotalnumberofaisweets).Ifthereisnosolutionwhereeachchildgetsatleastonesweetprint"nosweets"instead.Notethatifthereareseveralsolutionswhereeachchildgetsatleastonesweet,youmayprintanyofthem.Sample4512375367112513170Sample3523//“nosweets”。可以的话输出任一个满足条件的即可。即要求选择的糖果数目之和能被c整出:1.sum[i02.sum[i]的值已经在前面出现过的情况时,就可以知道有解,并sum[i]数值的后一个位置开始→sum[i]的位置,这个貌似可以解出#includeusingnamespaceintsum[100001];intuse[100001];intc,n;boolis;{inti,j,k;{{{}}{{}{for(k=use[sum[i]]+1;k<=i+1;k++)printf("%d%c",k,k==i+1?'\n':'');}}}return}D-CowSortingFarmerJohn'sN(1≤N≤10,000)cowsarelineduptobemilkedintheevening.Eachcowhasaunique"grumpiness"levelintherange1...100,000.SincegrumpycowsaremorelikelytodamageFJ'smilkingequipment,FJwouldliketoreorderthecowsinlinesotheyarelinedupinincreasingorderofgrumpiness.Duringthisprocess,theplacesofanytwocows(notnecessarilyadjacent)canbeinterchanged.Sincegrumpycowsarehardertomove,ittakesFJatotalofX+YunitsoftimetoexchangetwocowswhosegrumpinesslevelsareXandY.PleasehelpFJcalculatetheminimaltimerequiredtoreorderthecows.Line1:AsingleLine1:Asingleinteger:Lines2..N+1:Eachlinecontainsasingleinteger:linei+1describesthegrumpinessofcowi.Line1:Asinglelinewiththeminimaltimerequiredtoreorderthecowsinincreasingorderof231231:Initial213:Afterinterchangingcowswithgrumpiness3and1123:Afterinterchangingcowswithgrumpiness1and2大致题意:FarmerJohn有N头牛(1N10000)N头牛都很各应,各自有一个不同的脾气L(1L100000),这N头牛按脾气指数是无序排列,指数越大的越容易破坏farmersum+(len2)*minsumminlen1)*smallestusingnamespacestd;constintmaxn=10000+10;inta[maxn],c[100010];intvis[maxn],constintinf=1<<30;intMIN,MAX,sum;intwork(){intk,t,i,j,ans=for(i=1;i<=n;{ans=0;j=i;k=0;{if(t>t=vis[j]=1;j=vis[j]=1;j=ans+=min((k-2)*t,t+(k+1)*MIN);sum+=ans;}}return}{inti,j;intans;sum=0;MIN=inf,MAX=memset(vis,0,memset(c,0,sizeof(c));for(i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]<MIN=if(a[i]>MAX=}for(j=1;j<=MAX;c[jc[jc[j1求应有的位置ans=work();printf("%d\n",ans);return0;}题解:黑书P247,无聊的排序”。(完全一样5.Polya定理与Burnside引理6.组合数学N个小球放入Mnm个箱子里,有多少种不同的放法(不一定是球和箱子,也可能是其他的元素与其他的放置位置,例如NM不难看出一共8类情况--的公式是把n个球排成一排,(一种方法)n-1m-1个小棍,放到空是球减1里面挑M-1个箱子做组合就有n+m个球,C(n+m-1,m-1),多了M个元素而已11的N2S(n,k)=S(n-1,k-1)+k*S(n-1,k),含义是第NK个数等于他上一排的上一个位置数字加上一排的同样位置数字的K倍同理S(4,2)=S(3,1)+2*S(3,2)=1+2*3=7, 个相同箱子,每个箱子至少一个,则看三角形的第7行,第4个数字多少。6,N不同球,M同箱,允许空的时候(5的基础上允许空箱)。明显是N个球 看三角形就知道第8行前3个数字的和1 127+球不同,盒不同,非空,公式M!*S(N,M)=3!*S(8,3)=6*966=5796TimeLimit:1000MSMemoryLimit:(K表示)5,1,11,5,1t(0t20)M和N,以空格分开。对输入的每组数据M和N,用一行输出相应的K。SampleInput17intcount=0;intvoidDFS(intk,ints,int intvoidDFS(intk,ints,int {if(s==n){return;}inti;for(i=k;i>=0;i--){if(t+i<=m{DFS(i,s+1,}{}}}int{inti;{{DFS}}return}所有的小于p的质数就可以了。事实上,测试小于p的平方根的所有质数就可以了。AMt1*ABXm-Xa,Y-Ya,Z-Za)=t1*(Xb-Xa,Yb-Ya,Zb-M(t1(Xb-Xa)+XaAMt1*ABXm-Xa,Y-Ya,Z-Za)=t1*(Xb-Xa,Yb-Ya,Zb-M(t1(Xb-Xa)+Xa,t1(Yb-Ya)+Ya,t1(Zb-Za)+ZaN(t2(Xd-Xc)+Xc,t2(Yd-Yc)+Yc,t2(Zd-Zc)+Zcdoubledis(P&a,P&b,P{if(b.x!={doublek(b.ya.y(b.xa.x);fabs((pp.ya.y)k*(pp.xa.x))sqrt(1k*k}returnfabs(pp.x-}#include<stdio.h>#include<stdlib.h>#include<math.h>inttop;doubletypedef#include<stdio.h>#include<stdlib.h>#include<math.h>inttop;doubletypedefstruct{intx;intTPointvoidswap(TPointpoint[],inti,int{TPointtmp;tmp=point[i];point[j]=tmp;}doublemulti(TPointp1,TPointp2,TPoint{return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-}{return(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-}intcmp(constvoid*a,constvoid{TPoint*c=(TPoint*)a;TPoint*d=(TPointdoublek=multi(*c,*d,point[0]);if(k<0)return1;elseif(k==0&&distance(*c,point[0])>=distance(*d,point[0]))return1;elsereturn-}{//Graham扫描求{//Graham扫描求inti,u=0;for(i=1;i<=n1;i++){if((point[i].y<(point[i].y==point[u].y&&point[i].x<point[u].x))u=i;}//p[1]p[n1]按按极角排序,可采用快速排序qsort(point+1,n-1,sizeof(point[0]),cmp);for(i=0;i<=2;i++)stack[i]=i;top=2;for(i=3;i<=n-while(multi(point[i],point[stack[top]],point[stack[top-1]])>=0){top--;if(top==0)}stack[top]=i;}}int{doubletriangleArea(inti,intj,intk);voidPloygonTriangle();inti,while(scanf("%d",&n)&&n!=1){for(i=0;i<scanf("%d%d",&point[i].x,&point[i].y);if(n<=2){}if(n==printf("%.2lf\n",triangleArea(0,1,2));}}return}void{double}return}void{doubletriangleArea(inti,intj,intk);inti,j,k;max=-1;for(i=0;i<=top-2;i++){k=-for(j=i+1;j<=top-1;j++){if(k<=j)k=j+1;area=triangleArea(stack[i],stack[j],stack[k]);if(area>max)max=area;while(k+1<=area1=triangleArea(stack[i],stack[j],stack[k+1]);if(area1<area)break;if(area1>max)max=area1;area=area1;}}}}doubletriangleArea(inti,intj,int{//已知三角形三个顶点的坐标,求三角形的面doublel=fabs(point[i].x*point[j].y+point[j].x*+point[k].x*point[i].y-point[j].x*-point[k].x*point[j].y-point[i].x*point[k].y)/2;returnl;}DpLISProblem据是不大于30000的正整数,用空格分隔)Sample8389207155300299170158据是不大于30000的正整数,用空格分隔)Sample8389207155300299170158SampleOutputimportpublicclassMainpublicstaticvoidmain(String[]{Scannerscan=newScanner(System.in);whilenum==newn=max[]=new(intia[i]=0;i<n;i++)=}(inti=for1;ij=n;i++)j<i;j++)a[i]&&if(a[j]+1>max[i]=max[j]+if(num<max[i])num=}}}}}importif(num<max[i])num=}}}}}importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]{inta[]=newint[n];for(inti=0;i<n;i++)a[i]=scan.nextInt();}publicstaticintLIS(inta[],intn){intnum[]=newint[n];inti,j;{{}}intmax=0;returnmax;}模版3(推荐nlogn)publicclassMainpublicstaticvoid{Scannerscan=n==newint[n+b[]=newint[n+1];(inti=n==newint[n+b[]=newint[n+1];(inti=1;i<=n;{a[i]=}k=b[1]=(inti=2;i<=n;i++)if(a[i]b[k])//>=为最长不降子序列b[++k]=a[i];elseintj=while(a[i]<=b[j])b[j+1]=}}}}DP20classMain{publicstaticvoidmain(String[]args){Scannerin=newStringstr1=in.next();Stringstr2=int[][]DP=newint[str1.length()+1][str2.length()+1];inti;DP[i][0]=0;DP[0][i]=0;j=1;j<=str2.length();j++){if(str1.charAt(i-1)==str2.charAt(j-1))}}}}j=1;j<=str2.length();j++){if(str1.charAt(i-1)==str2.charAt(j-1))}}}}412326467{{classinta,b;staticvoidmain(String[]args)throwsInputStreamReaderis=newInputStreamReader(System.in);BufferedReaderin=newBufferedReader(is);String[]ss=in.readLine().split("");p=newint[a+1];q=newint[a+1];for(inti=1;i<=a;i++){ss=in.readLine().split("");}d=newint[b+1];for(inti=1;i<=a;i++)for(intj=b;j>=p[i];j--)d[j]=Math.max(d[j-p[i]]+q[i],d[j]);}}E-完全背包裸题Memory64bitIOFormat:%I64d&}}E-完全背包裸题Memory64bitIOFormat:%I64d&大,越幸福),b表示湫湫吃这种食物会吸收的卡路里量。[Technical101n<=a,b<=m<=37953791510676SampleOutputusingnamespace6SampleOutputusingnamespace{intt;{inti,j,aim;intka[105],val[105];for(i=0;i<t;i++)for(i0;i<t;i++){for(j=ka[i];j<=aim;{dp[j]=max(dp[j],dp[j-}}}return}Sample101201000100000SampleCollection#1:Can'tbedivided.00000SampleCollection#1:Can'tbedivided.Collection#2:Canbeusingnamespacestd;voidbag01(intv,int{for(inti=aim;i>=v;i--)}voidbag11(intv,int{for(inti=v;i<=aim;i++)}voidbagmuti(intm,intv,int{{intk=1;{}}}{intcas=0;{inttol=1*n[1]+2*n[2]+3*n[3]+4*n[4]+5*n[5]+6*n[6];{printf("Collection#%d:\n",(++cas));{}}{intcas=0;{inttol=1*n[1]+2*n[2]+3*n[3]+4*n[4]+5*n[5]+6*n[6];{printf("Collection#%d:\n",(++cas));{printf("Can'tbe}{for(inti=1;i<=6;if(dp[aim]==aim)printf("Canbeelse}}}return}Sample)[)(Sample66406usingSample66406usingnamespacestd;chars[110];boolboolmatch(inta,int{if(s[a]=='('&&s[b]==')')returnif(s[a]=='['&&s[b]==']')returntrue;returnfalse;}void{inti,j,k;{{}{}}for{{}}}int{{{}}}int{{}return}大和所在的子区间(L,R。0~9#intmaxsum(inta[],intleft,int{intintintsum1=0;intlefts=0;intsum1=0;intlefts=0;}intsum2=0;intrights=0;if(rights>sum2)sum2=rights;}if(localsum<leftsum)localsum=leftsum;}return}int{intintn,temp,i,j,k,max;}return}intmain(){intintn,temp,i,j,k,max;{{inttemp=0;}}}return}HDU100356-154}}}return}HDU100356-154-706-11-6-Sample144Case71publicclassMain{publicstaticvoidargs)Scannerscan=newm=a[]=newint[100001];i,j,m,n;(j=1;j<=m;j++)intsum=0,maxsum,startn=scan.nextInt();=0,=0,k=for(i}maxsum0;i<n;i++)=for(i0;i<n;i++)sum+=if(sum>{maxsum=sum;end=i;start=}ifk}<=i0)+}if(j!={System.out.println("Case}ifk}<=i0)+}if(j!={System.out.println("Case"+j+""+":");.println(maxsum+""+(start+1)+""+(end+1));}elseSystem.out.println("Case"+j+""+":");.println(maxsum+""+(start+1)+""+(end+}}}}A-ParkAnintegerT(T≤20)willexistinthefirstlineofinput,indicatingthenumberoftestcases.EachtestcasebeginswithtwointegersNandM(1≤N,M≤105),whichrespectivelydenotesthenumberofnodesandqueries.ThefollowingThenodesMlines,eachwithanlabeledfrom1toN.Sample1431424Foreachquery,outputtheminimumwalkingdistance,oneperSampleOutput4SampleOutput4到(因为是一棵树S-Tk,则我们只需要沿着路径一直走就2*xxnum直径的求法:两遍BFS(orDFS)于是原问题可以在O(Euv如果u在最长路上,那么v一定是最长路的一端。可以用反证法:假设v不是最长路的一端,则存在另一点v’使得(u→v’len(u→v’)len(u→v)。但这与条件“v是距u最远的点”矛盾。如果u不在最长路上,则u到其距最远点v的路与最长路一定有一交点c,且(c→v)与最长路的后半段重合(why?),即v一定是最长路的一端一部分l1,一部分l2l2对称,取l1l2都一样)usingnamespaceconstintstructintconstintstructintvoidaddedge(intcu,int}voidDFS(intfor(inti=head[u];i!=-1;i=edge[i].nxt){intv=edge[i].to;}}}intt;intu,v;i=1;i<n;i++){scanf("%d%d",&u,&v);addedge(u,v);}intfor(inti=1;i<=n;i++)}for(inti=1;i<=n;i++)intfor(inti=1;i<=n;i++)int}}return}3Test4TestTest这算是八皇后问题的变种了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论