| ||||||||||
| 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