Pagini recente » Cod sursa (job #3326258) | Monitorul de evaluare | Cod sursa (job #3333401) | Cod sursa (job #3316639) | Cod sursa (job #3340344)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("mins.in");
ofstream fout("mins.out");
const int NMAX = 1e6;
int n, m;
int last_prime[NMAX + 1];
ll answer;
void eratostene() {
for(int i = 2; i <= NMAX; i++) {
if(!last_prime[i]) {
for(int j = i; j <= NMAX; j += i) {
last_prime[j] = i;
}
}
}
}
ll ired(int x) {
vector<int> factors;
int cx = x;
while(x > 1) {
int d = last_prime[x];
factors.push_back(d);
while(x % d == 0) {
x /= d;
}
}
x = cx;
int sz = factors.size();
ll answer = m;
for(int mask = 1; mask < (1 << sz); mask++) {
ll prod = 1;
for(int i = 0; i < sz; i++) {
if(mask >> i & 1) {
prod *= factors[i];
}
}
int sign = (__builtin_popcount(mask) % 2 == 1 ? -1 : 1);
answer += sign * m / prod;
}
// cout << x << ' ' << answer << '\n';
return answer;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
eratostene();
fin >> n >> m;
n--; m--;
for(int x = 1; x <= n; x++) {
answer += ired(x);
}
fout << answer << '\n';
return 0;
}