Pagini recente » Monitorul de evaluare | Cod sursa (job #1075300) | Cod sursa (job #471513) | Cod sursa (job #356994) | Cod sursa (job #2091506)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("mins.in");
ofstream out("mins.out");
int const nmax = 1000000;
vector<int> v[5 + nmax];
int n , m;
void precompute(){
for(int i = 2 ; i <= n ;i++){
if(v[i].size() == 0){
for(int j = i ; j <= n ;j += i){
v[j].push_back(i);
}
}
}
}
int cmmmc(int a ,int b){
int pr = a * b;
while(0 < b){
int temp = a % b;
a = b;
b = temp;
}
return pr / a;
}
int solve(int number){
int primes = v[number].size();
int sum = 0 ;
for(int i = 1 ; i < (1 << primes) ;i++){
int p = 1;
int scount = 0;
for(int j = 0 ; j < primes ;j++){
if(0 < (i & (1 << j))){
p = cmmmc(p ,v[number][j]);
scount++;
}
}
if(scount % 2 == 1){
sum += m / p;
} else
sum -= m / p;
}
return m - sum;
}
int main()
{
in>>n>>m;
n--;
m--;
precompute();
int sum = m ,sum2 = m;
for(int i = 2 ;i <= n ;i++){
sum += solve(i);
sum2 = sum;
}
out<<sum;
return 0;
}