Codeforces Round #392 (Div. 2), problem: (F) Geometrical Progression Solution in C/C++

#include<stdio.h>
#include<stdlib.h>
#define N 10000001
#define SN 3163
typedef long long unsigned llu;
typedef unsigned u;
int F(const void*x,const void*y)
{
if(*(llu*)x>*(llu*)y)return 1;
if(*(llu*)y>*(llu*)x)return-1;
return 0;
}
u D[N],Ga[N],Gi[N];llu *G[N];
int main()
{
u a,b,c,i,j,k,n,x,y,lo,hi,mi;llu e;llu r=0;
for(i=0;++i<SN;)for(k=i*i,j=0;(j+=k)<N;)D[j]=i;
scanf(“%u%u%u”,&n,&x,&y);
if(n<3)
{
r=y-x+1;
if(n==0)r=1;
if(n==2)r=r*(r-1);
printf(“%I64u\n”,r);
return 0;
}
for(a=y+1;a–>x;)
{
for(i=0;++i;)
{
if((b=a/D[a]*(D[a]+i))>y)break;
if((c=b/D[a]*(D[a]+i))>y)break;
if(n==3){++r;continue;}
if((e=c*(llu)(D[a]+i))%D[a]>0||e/D[a]>y)continue;
j=c/(b/D[b]);
lo=0;hi=Gi[b];
while((mi=(lo+hi)>>1)>lo)
{
if((G[b][mi]>>32)>j)hi=mi;
else lo=mi;
}
if(!hi||(G[b][lo]>>32)!=j)k=4;
else k=1+(G[b][lo]&-1u);
if(Gi[a]==Ga[a])
{
if(!Ga[a])G[a]=(llu*)calloc(Ga[a]=1,sizeof(llu));
else G[a]=(llu*)realloc(G[a],(Ga[a]<<=1)*sizeof(llu));
}
G[a][Gi[a]++]=(((llu)(D[a]+i))<<32)|((llu)k);
if(k>=n)++r;
}
if(Gi[a])qsort(G[a],Gi[a],sizeof(llu),F);
}
printf(“%I64u\n”,r<<1);
return 0;
}

(Visited 77 times, 1 visits today)

About the Author:

Leave A Comment