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 件のコメント:
コメントを投稿