//
// Brilliant - A Lot of Phi's.cpp
// programas2
//
// Created by Lucca Siaudzionis on 20/06/14.
// Copyright (c) 2014 Luccasiau. All rights reserved.
//
#include <cstdio>
#include <vector>
#define MAXP 55050
using namespace std;
int n;
int mark[MAXP];
vector<int> primes;
#define MODULO 1000000007
int isprime(int x){ //returns the smallest prime that divides X or returns 0 if X is prime
//printf(":(\n");
if(x == 2) return 0;
for(int i = 0;i<primes.size();i++){
if(primes[i]*primes[i] > x) break;
if(x % primes[i] == 0) return primes[i];
}
return 0;
}
int maxexp(int d,int x){
if(x % d) return 0;
return 1+(maxexp(d,x/d));
}
int phi_prime(int p,int exp){ //this consists of using phi(p^k) = (p-1)*p^(k-1)
int aux = 1;
for(int i = 1;i<=exp-1;i++) aux *= p;
return aux*(p-1);
}
int phi(int x){ //recursive function to calculate phi(x)
if(x <= 1) return 1;
int turn = isprime(x);
if(!turn) return x-1; //if x is a prime, phi(x) = x-1
int exp = maxexp(turn,x);
int aux=1;
for(int i = 1;i<=exp;i++) aux *= turn;
return phi_prime(turn,exp)*phi(x/aux); //this is true since phi is a multiplicative function
}
int main(){
for(int i = 2;i<MAXP;i++){ // Builds 'primes' vector
if(!mark[i]){
primes.push_back(i);
for(int j = i+i;j<MAXP;j+=i) mark[j] = 1;
}
}
int ANSWER = 0LL;
while( scanf("%d",&n) != EOF ){
ANSWER += phi(n);
ANSWER %= MODULO;
}
printf("%d\n", ANSWER);
return 0;
}
Ly8KLy8gIEJyaWxsaWFudCAtIEEgTG90IG9mIFBoaSdzLmNwcAovLyAgcHJvZ3JhbWFzMgovLwovLyAgQ3JlYXRlZCBieSBMdWNjYSBTaWF1ZHppb25pcyBvbiAyMC8wNi8xNC4KLy8gIENvcHlyaWdodCAoYykgMjAxNCBMdWNjYXNpYXUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vCiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDx2ZWN0b3I+CiNkZWZpbmUgTUFYUCA1NTA1MAp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG47CmludCBtYXJrW01BWFBdOwp2ZWN0b3I8aW50PiBwcmltZXM7CgojZGVmaW5lIE1PRFVMTyAxMDAwMDAwMDA3CgppbnQgaXNwcmltZShpbnQgeCl7IC8vcmV0dXJucyB0aGUgc21hbGxlc3QgcHJpbWUgdGhhdCBkaXZpZGVzIFggb3IgcmV0dXJucyAwIGlmIFggaXMgcHJpbWUKICAgIAogICAgLy9wcmludGYoIjooXG4iKTsKICAgIAogICAgaWYoeCA9PSAyKSByZXR1cm4gMDsKICAgIAogICAgZm9yKGludCBpID0gMDtpPHByaW1lcy5zaXplKCk7aSsrKXsKICAgICAgICAKICAgICAgICBpZihwcmltZXNbaV0qcHJpbWVzW2ldID4geCkgYnJlYWs7CiAgICAgICAgCiAgICAgICAgaWYoeCAlIHByaW1lc1tpXSA9PSAwKSByZXR1cm4gcHJpbWVzW2ldOwogICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4gMDsKICAgIAp9CgppbnQgbWF4ZXhwKGludCBkLGludCB4KXsKICAgIAogICAgaWYoeCAlIGQpIHJldHVybiAwOwogICAgcmV0dXJuIDErKG1heGV4cChkLHgvZCkpOwogICAgCn0KCmludCBwaGlfcHJpbWUoaW50IHAsaW50IGV4cCl7IC8vdGhpcyBjb25zaXN0cyBvZiB1c2luZyBwaGkocF5rKSA9IChwLTEpKnBeKGstMSkKICAgIAogICAgaW50IGF1eCA9IDE7CiAgICBmb3IoaW50IGkgPSAxO2k8PWV4cC0xO2krKykgYXV4ICo9IHA7CiAgICAKICAgIHJldHVybiBhdXgqKHAtMSk7CiAgICAKfQoKCmludCBwaGkoaW50IHgpeyAvL3JlY3Vyc2l2ZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgcGhpKHgpCiAgICAKICAgIGlmKHggPD0gMSkgcmV0dXJuIDE7CiAgICAKICAgIGludCB0dXJuID0gaXNwcmltZSh4KTsKICAgIAogICAgaWYoIXR1cm4pIHJldHVybiB4LTE7IC8vaWYgeCBpcyBhIHByaW1lLCBwaGkoeCkgPSB4LTEKICAgIAogICAgaW50IGV4cCA9IG1heGV4cCh0dXJuLHgpOwogICAgaW50IGF1eD0xOwogICAgZm9yKGludCBpID0gMTtpPD1leHA7aSsrKSBhdXggKj0gdHVybjsKICAgIAogICAgcmV0dXJuIHBoaV9wcmltZSh0dXJuLGV4cCkqcGhpKHgvYXV4KTsgLy90aGlzIGlzIHRydWUgc2luY2UgcGhpIGlzIGEgbXVsdGlwbGljYXRpdmUgZnVuY3Rpb24KICAgIAp9CgoKCmludCBtYWluKCl7CiAgICAKICAgIGZvcihpbnQgaSA9IDI7aTxNQVhQO2krKyl7IC8vIEJ1aWxkcyAncHJpbWVzJyB2ZWN0b3IKICAgICAgICBpZighbWFya1tpXSl7CiAgICAgICAgICAgIHByaW1lcy5wdXNoX2JhY2soaSk7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IGkraTtqPE1BWFA7ais9aSkgbWFya1tqXSA9IDE7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpbnQgQU5TV0VSID0gMExMOwogICAgd2hpbGUoIHNjYW5mKCIlZCIsJm4pICE9IEVPRiApewogICAgICAgIEFOU1dFUiArPSBwaGkobik7CiAgICAgICAgQU5TV0VSICU9IE1PRFVMTzsKICAgIH0KICAgIAogICAgcHJpbnRmKCIlZFxuIiwgQU5TV0VSKTsKICAgIAogICAgcmV0dXJuIDA7Cn0=