Pagini recente » Cod sursa (job #2403400) | Cod sursa (job #5007) | Cod sursa (job #873030) | Cod sursa (job #827417) | Cod sursa (job #756775)
Cod sursa(job #756775)
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
int main() {
ifstream f("sum.in");
freopen ("sum.out","w",stdout);
int n=0, i, j, t, phi[200005], x[100005];
long long rez;
f>>t;
for(i=1; i<=t; i++) {
f>>x[i];
if(2*x[i]>n) n=2*x[i]; //n = 2*max(x[i])
}
for(i=1; i<=n; i++) phi[i] = i; //indicatorul lui euler (phi[i] = nr de numere prime cu i, mai mici decat i)
for(i=2; i<=n; i++) { //initializez cu i, si din toti multiplii lui i scad phi[i]
if(phi[i]==i) //optimizare: ma duc doar pe multipli de numere prime
for(j=i; j<=n; j+=i) { //aka il calculez folosind ciurul
phi[j] /= i;
phi[j] *= (i-1);
}
}
for(i=1; i<=t; i++) {
//g<<1LL*phi[x[i]]*2*x[i]<<"\n"; //ceva formula dedusa
rez=1LL*phi[x[i]]*2*x[i];
printf("%lld\n",rez);
}
f.close();
return 0;
}