Cod sursa(job #373502)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 13 decembrie 2009 22:30:00
Problema Mins Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <cstring>

#define file_in "mins.in"
#define file_out "mins.out"

int a,b,min,max,res;
int prim[10010],t[11010][20],nrp[10010];

inline int cmmdc(int a, int b)
{
	int r;
    while(b)
	{
		r=a%b;
		a=b;
		b=r;
	}
	
	return a;
}

int count(int x)
{
	int nr,i;
	
	nr=x;
    for (i=1;i<=nrp[x];++i) 
		 {
			 if (nr%t[x][i]==0) nr=(nr/t[x][i])*(t[x][i]-1);
			 else nr=(nr/t[x][i]+1)*(t[x][i]-1);
	     }
				 
    return nr;
}


int main()
{
	int i,j;
	freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);
	
	scanf("%d %d", &a, &b);
	a--;b--;
	if (a>b) 
	{ 
		max=a;
	    min=b;
	}
	else 
	{
		min=a;
		max=b;
	}
	
	memset(prim,0,sizeof(prim));   
	nrp[1]=1;
    t[1][1]=1;
	
	for (i=2;i<=min;++i)
		 if (!prim[i])
		 {
			 for (j=i*2;j<=min;j+=i)
				   prim[j]=1;
			 t[j][++nrp[j]]=i;
		 }
	
	for (i=2;i<=min;++i)
		 for (j=1;j<i;++j)
			 if (j==1) res++;
		 else
		 /*res+=count(i);*/
			 if (cmmdc(i,j)==1) res++;
	
	res*=2; 
	//res+=(max-min);
	for (i=min+1;i<=max;++i)
		 for (j=1;j<=min;++j)
			 if (j==1) res++;
             else		 
			 if (cmmdc(i,j)==1)
				  res++;
	
	printf("%d", res+1);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}