2011年9月21日水曜日

Google Code Jam Japan 2011 #2

Code Jam の問題がどうしても答えが合わないので別のアルゴリズムでといてみました。
前回は集合を足していく方法で求めたので、今回は集合を引いていく方法で求めて見ました。
やはりGoogleと答えが合わない。

------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(_MSC_VER) && _MSC_VER<1300
#define longlong _int64
#define PLLD "%I64d"
#else
#define longlong long long
#define PLLD "%lld"
#endif

#define PLD "%ld"
#define PD "%d"


char sosu[1000010];
int sosu_list[100000];

char onaji[1000010];

main(){
    FILE *fi=NULL,*fo=NULL;

    char buf[256];
    longlong a,b,p;
   
    int i,j,c;
    int sct,kotae;

    //sosou wo motomeru
    sosu[0]=1;
    sosu[1]=1;
    for(i=2;i<1000003;i++){
        if(sosu[i]==0){
            for(j=i*2;j<1000010;j+=i)sosu[j]=1;
        }
    }

    for(sct=0,i=0;i<1000003;i++)if(sosu[i]==0){
        sosu_list[sct++]=(int)i;
    }

    printf("sosu=%d\n",sct);
    //fi=fopen("test.txt","rt");
    //fi=fopen("B-small-practice.in","rt");
    fi=fopen("B-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    //fo=fopen("result-small.txt","wt");
    fo=fopen("result-large.txt","wt");

    if(fi==NULL || fo==NULL)goto end;


    fgets(buf,sizeof(buf),fi);
    sscanf(buf,PD,&c);



    for(i=0;i<c;i++){

        fgets(buf,sizeof(buf),fi);
        sscanf(buf,PLLD PLLD PLLD ,&a,&b,&p);

        kotae=(int)(b-a+1);
        memset(onaji,0,sizeof(onaji));

        // kousoku soinnsuu bunkai
        printf("bunkai\n");
        for(j=0;j<sct;j++){
            longlong t;
            int flag=0,kita=0;
            if((longlong)(sosu_list[j])<p)continue;
            if((longlong)(sosu_list[j])>b)break;

            t=a+sosu_list[j]-1;
            t/=sosu_list[j];
            t*=sosu_list[j];

            //printf(PLLD"\n" ,t);
            while(t<=b){
                int pos=t-a;
                kita=1;
                if(onaji[pos]==0)kotae--;
                else flag=1;
                onaji[pos]=1;
                t+=sosu_list[j];
            }
            if(flag==0 && kita==1)kotae++;
        }

        printf("Case #%d: %d\n",i+1,kotae);
        fprintf(fo,"Case #%d: %d\n",i+1,kotae);
        //break;
    }


end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);

}


------------------------------

0 件のコメント:

コメントを投稿