Cod sursa(job #631058)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 6 noiembrie 2011 20:51:57
Problema Mins Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<vector>

#define pb push_back
#define maxdim 1000005

using namespace std;

FILE*f=fopen("mins.in","r");
FILE*g=fopen("mins.out","w");

int c,d,i,j,k,m,conf,nrb; long long sol,r;
int ciur[maxdim],nr[maxdim];
vector<int>G[maxdim];

int main () {
	
	fscanf(f,"%d %d",&c,&d); --c; --d;
	
	for ( i = 2 ; i <= c ; ++i ){
		if ( !ciur[i] ){
			G[i].pb(i);
			for ( j = i + i ; j <= c ; j += i ){
				if ( !(j % (i*i)) )
					ciur[j] = -1;
				G[j].pb(i);
				if ( ciur[j] != -1 )	ciur[j] = 1;
			}
		}
	}
	
	for ( i = 2 ; i <= c ; ++i ){
		if ( ciur[i] == -1 ){
			r = 1;
			for ( k = 0 ; k < G[i].size() ; ++k ){
				r *= G[i][k];
			}
			sol += nr[r];
			continue ;
		}
		m = G[i].size();
		for ( j = 1 ; j < (1<<m) ; ++j ){
			conf = j; r = 1; nrb = 0;
			for ( k = 0 ; k < m ; ++k){
				if ( conf & 1 ){
					r *= G[i][k]; ++nrb;
				}
				conf >>= 1;
			}
			if ( nrb & 1 ){
				sol += d / r; nr[i] += d / r;
			}
			else{
				sol -= d / r; nr[i] -= d / r;
			}
		}
	}
	
	sol = 1LL * c * d - sol;
	
	fprintf(g,"%lld\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}