Cod sursa(job #865364)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 26 ianuarie 2013 13:25:19
Problema Mins Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<iostream>
#include<fstream>
#include<bitset>
using namespace std;

#define NMAX 1000001

bitset <NMAX> p;
int fact[NMAX],d[NMAX];

inline void ciur()
{
	int i,j;
	for(i=2;i<=NMAX-1;i++)
		if(p[i]==0) {
			for(j=i+i;j<=NMAX-1;j=j+i)
				p[j]=1;
			fact[++fact[0]]=i;
		}
}

inline int pinex(int a, int b)
{
	int nr,i,j,k,sol,prod;
	k=0;
	i=1;
	while(b>1 && i<=fact[0]) {
		if(b%fact[i]==0) {
			d[++k]=fact[i];
			while(b%fact[i]==0)
				b=b/fact[i];
		}
		i++;
	}
	if(b>1)
		d[++k]=b;
	sol=0;
	for(i=1;i<=(1<<k)-1;i++) {
		nr=0;
		prod=1;
		for(j=0;j<=k-1;j++)
			if(i&(1<<j)) {
				nr++;
				prod=prod*d[j+1];
			}
		if(nr%2)
			nr=1;
		else nr=-1;
		sol=sol+nr*a/prod;
	}
	return a-sol;
}

int main ()
{
	int c,d,i;
	long long sol;
	ifstream f("mins.in");
	ofstream g("mins.out");
	f>>c>>d;
	f.close();
	sol=0;
	for(i=1;i<=c-1;i++)
		sol=sol+pinex(d-1,i);
	g<<sol;
	g.close();
	return 0;
}