| ||||||||||
| 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 | |||||||||
老老实实计算也能ac,只要发现周期性#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