| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:老老实实计算也能ac,只要发现周期性In Reply To:老老实实计算也能ac,只要发现周期性 Posted by:ar_dong at 2021-11-29 10:44:13 > #include <stdlib.h> > #include <stdio.h> > #include <string.h> > #include <assert.h> > typedef unsigned long long int U64; > //using namespace std; > int next[800000]; > int buf0[800000]; > int res0[800000]; > int res1[800000]; > int buf1[800000]; > int lookback; > int ii; > int offset; > int find_next(int max,int count,int buf_in[8000],int res_in[8000],int num_in,int buf_out[8000],int res_out[8000]){ > int i,j; > int k=0; > int tmp; > int res; > int res1; > static int mult; > int div=max*2-count; > if (count==0) mult=1; > else mult*=2*max-count+1; > //printf("nult=%d\n",mult); > i=0; > //for(i=0;i<max*2-count;i++){ > for(j=0;j<num_in;j++){ > tmp=mult*i+buf_in[j]; > res=res_in[j]; > res1=(tmp-res)%(div); > if(res1){ > res1=div-res1; > } > if(res1<max-count){ > buf_out[k]=tmp; > res_out[k]=res1; > k++; > } > > } > //} > return k; > } > int gen_next(int max,int count,int buf_in[8000],int res_in[8000],int num_in,int buf_out[8000],int res_out[8000]){ > int i,j; > int k=0; > int tmp; > int res; > int res1; > static int mult; > > if (count==0) mult=1; > else mult*=2*max-count+1; > //printf("nult=%d\n",mult); > for(i=0;i<max*2-count;i++){ > for(j=0;j<num_in;j++){ > tmp=mult*i+buf_in[j]; > res=res_in[j]; > res1=(tmp-res)%(max*2-count); > if(res1){ > res1=max*2-count-res1; > } > if(res1<max-count){ > buf_out[k]=tmp; > res_out[k]=res1; > k++; > } > > } > } > return k; > } > int gen_next(int max){ > int i=max+1; > int j=0; > int last=0; > int tmp; > > return j; > } > int find_next(int max){ > if(max<5)ii++; > else { > ii++; > } > return ii; > } > int core(int max){ > int i,j; > int res=max*2; > int tootle; > int tmp; > ii=max+1; > int sum=0; > int ans[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,13482720,25779600,68468401,610346880}; > > int num_in; > int num_out; > num_in=1; > buf0[0]=0; > res0[0]=0; > int *buf_in; > int *buf_out; > int *buf_tmp; > int *res_in; > int *res_out; > int *res_tmp; > buf_in=buf0; > buf_out=buf1; > res_in=res0; > res_out=res1; > num_out=gen_next(max,0,buf_in,res_in,num_in,buf_out,res_out); > if(max==1){ > if(num_out<2) return max*2; > else return buf_out[1]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=gen_next(max,1,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d\n",num_out); > if(max==2){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=gen_next(max,2,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d\n",num_out); > if(max==3){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=gen_next(max,3,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d\n",num_out); > if(max==4){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,4,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==5){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,5,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==6){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,6,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==7){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,7,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==8){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,8,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==9){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,9,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==10){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,10,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==11){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,11,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==12){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > buf_tmp=buf_in; > buf_in=buf_out; > buf_out=buf_tmp; > res_tmp=res_in; > res_in=res_out; > res_out=res_tmp; > num_in=num_out; > num_out=find_next(max,12,buf_in,res_in,num_in,buf_out,res_out); > //for(i=0;i<num_out;i++){ > // printf("%4d,", buf_out[i]); > //} > //printf("\n"); > //for(i=0;i<num_out;i++){ > // printf("%4d,", res_out[i]); > //} > //printf("\n"); > //printf("num=%d,max=%d\n",num_out,buf_out[num_out-1]); > if(max==13){ > for(i=1;i<num_out;i++) > if(res_out[i]==0) > return buf_out[i]; > } > return ans[max]; > } > /* > int buf[15][800000]; > int res[15][800000]; > int num[15]; > int last_num[15]; > int r_num[15]; > int mult_ram[15]; > int offset_ram[15]; > int count_ram[15]; > int offset[15]; > int core1(int max){ > int i,j; > int tmp; > unsigned int mult=1; > int nex; > int res0,res1; > for(j=0;j<15;j++){ > num[j]=0; > last_num[j]=0; > r_num[j]=0; > mult_ram[j]=0; > offset_ram[j]=0; > count_ram[j]=0; > offset[j]=0; > > } > buf[0][0]=0; > res[0][0]=0; > num[0]=1; > last_num[0]=1; > mult_ram[0]=1; > offset_ram[0]=0; > count_ram[0]=0; > for(j=0;j<max;j++){ > mult*=2*max-j; > if(mult>1<<26) mult=1<<26; > mult_ram[j+1]=mult; > num[j+1]=0; > last_num[j+1]=800000; > offset_ram[j+1]=0; > count_ram[j+1]=0; > } > > for(i=0;i<1<<30;i=nex){ > nex=-1; > res0=0; > //printf("x%d,",i); > if(i<mult_ram[1]){ > for(j=0;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(tmp); > if(res1){ > res0=tmp-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > return i; > } > } > else > break; > } > nex=i+1; > //printf("a%d,",nex); > offset_ram[1]=0; > count_ram[1]=1; > } > else if(i<mult_ram[2]){ > res0=res[1][offset_ram[1]++]; > for(j=1;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(max*2-j); > if(res1){ > res0=max*2-j-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > //for(int k=0;k<num[4];k++)printf("%d,",buf[4][k]);printf("\n"); > return i; > } > } > else > break; > } > if(offset_ram[1]==num[1]){ > offset_ram[1]=0; > count_ram[1]++; > } > > > nex=count_ram[1]*mult_ram[1]+buf[1][offset_ram[1]]; > offset_ram[2]=0; > count_ram[2]=1; > //printf("b%d,",nex); > } > else if(i<mult_ram[3]){ > res0=res[2][offset_ram[2]++]; > for(j=2;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(tmp); > if(res1){ > res0=tmp-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > //for(int k=0;k<num[4];k++)printf("%d,",buf[4][k]);printf("\n"); > //for(int k=0;k<num[5];k++)printf("%d,",buf[5][k]);printf("\n"); > return i; > } > } > else > break; > } > if(offset_ram[2]==num[2]){ > offset_ram[2]=0; > count_ram[2]++; > } > > > nex=count_ram[2]*mult_ram[2]+buf[2][offset_ram[2]]; > offset_ram[3]=0; > count_ram[3]=1; > //printf("c%d,",nex); > } > else if(i<mult_ram[4]){ > res0=res[3][offset_ram[3]++]; > for(j=3;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(tmp); > if(res1){ > res0=tmp-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > //for(int k=0;k<num[4];k++)printf("%d,",buf[4][k]);printf("\n"); > //for(int k=0;k<num[5];k++)printf("%d,",buf[5][k]);printf("\n"); > //for(int k=0;k<num[6];k++)printf("%d,",buf[6][k]);printf("\n"); > return i; > } > } > else > break; > } > if(offset_ram[3]==num[3]){ > offset_ram[3]=0; > count_ram[3]++; > } > > > nex=count_ram[3]*mult_ram[3]+buf[3][offset_ram[3]]; > offset_ram[4]=0; > count_ram[4]=1; > //printf("d%d,",nex); > } > else if(i<mult_ram[5]){ > res0=res[4][offset_ram[4]++]; > for(j=4;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(tmp); > if(res1){ > res0=tmp-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > //for(int k=0;k<num[4];k++)printf("%d,",buf[4][k]);printf("\n"); > //for(int k=0;k<num[5];k++)printf("%d,",buf[5][k]);printf("\n"); > //for(int k=0;k<num[6];k++)printf("%d,",buf[6][k]);printf("\n"); > return i; > } > } > else > break; > } > if(offset_ram[4]==num[4]){ > offset_ram[4]=0; > count_ram[4]++; > } > > > nex=count_ram[4]*mult_ram[4]+buf[4][offset_ram[4]]; > offset_ram[5]=0; > count_ram[5]=1; > //printf("d%d,",nex); > } > else if(i<mult_ram[6]){ > res0=res[5][offset_ram[5]++]; > for(j=5;j<max;j++){ > int tmp=max*2-j; > res1=(i-res0)%(tmp); > if(res1){ > res0=tmp-res1; > } > else > res0=res1; > if(res0<max-j){ > buf[j+1][num[j+1]]=i; > res[j+1][num[j+1]]=res0; > num[j+1]++; > if(num[max]==2) { > //for(int k=0;k<num[0];k++)printf("%d,",buf[0][k]);printf("\n"); > //for(int k=0;k<num[1];k++)printf("%d,",buf[1][k]);printf("\n"); > //for(int k=0;k<num[2];k++)printf("%d,",buf[2][k]);printf("\n"); > //for(int k=0;k<num[3];k++)printf("%d,",buf[3][k]);printf("\n"); > //for(int k=0;k<num[4];k++)printf("%d,",buf[4][k]);printf("\n"); > //for(int k=0;k<num[5];k++)printf("%d,",buf[5][k]);printf("\n"); > //for(int k=0;k<num[6];k++)printf("%d,",buf[6][k]);printf("\n"); > > //for(int k=0;k<15;k++)printf("%d,",num[k]);printf("\n"); > return i; > } > } > else > break; > } > if(offset_ram[5]==num[5]){ > offset_ram[5]=0; > count_ram[5]++; > } > > > nex=count_ram[5]*mult_ram[5]+buf[5][offset_ram[5]]; > offset_ram[6]=0; > count_ram[6]=1; > //printf("d%d,",nex); > } > else{ > break; > } > } > //for(j=0;j<max+1;j++){ > // for(i=0;i<num[j];i++){ > // printf("%d,",buf[j][i]); > // } > // printf("\n"); > //} > //for(i=0;i<15;i++) > // printf("%d,",num[i]); > //printf("\n"); > return i; > } > */ > > int main(){ > int max_p ; > int i; > //tmp_buf0[0]=0; > > int tmp; > int max; > int a=scanf("%d",&max); > int ans[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,13482720,25779600,68468401,610346880}; > while(max){ > tmp=core(max); > printf("%d\n",tmp); > //input(tmp_buf,max); > //maopao(tmp_buf,max); > //i=core(tmp_buf,max); > //printf("%d\n",i); > a=scanf("%d",&max); > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator