#include #include #define MAX_SIZE 48 /* STL ちゃんと覚えよう。と思った今日この頃 */ void init(int *single_prime_powered) { int i, j, k, p; int primes[MAX_SIZE], size; size = 0; for(i = 2; i < MAX_SIZE; ++i) { for(j = 0; j < size; ++j) { if( i % primes[j] == 0 ) break; } if( j == size ) primes[size++] = i; } single_prime_powered[0] = 0; single_prime_powered[1] = 0; for(i = 2; i < MAX_SIZE; ++i) { single_prime_powered[i] = 0; for(j = 0; j < size; ++j) { p = primes[j]; for(k = i; k > 1; k /= p) { if( k % p != 0 ) break; } if( k == 1 ) { single_prime_powered[i] = p; break; } } } } long long mul(int *a, int size) { int i; long long result = 1; for(i = 0; i < size; ++i) { result *= a[i]; } return result; } long long solve(long long n, int d) { int result; for(result = 1; result < d; ++result) { if( (result * n) % d == 1 ) break; } return result; } int main() { int n, i, p, d; int used[MAX_SIZE], input[MAX_SIZE]; int single_prime_powered[MAX_SIZE]; int used_number[MAX_SIZE], size; long long lcm, result; init(single_prime_powered); while(1) { scanf("%d", &n); if( n == 0 ) break; for(i = 1; i <= n; ++i) { scanf("%d", &input[i]); used[i] = 0; } size = 0; for(i = n; i > 0; --i) { p = single_prime_powered[i]; if( p && !used[p] ) { used[p] = 1; used_number[size++] = i; } } lcm = mul(used_number, size); result = 0; for(i = 0; i < size; ++i) { d = used_number[i]; result += (lcm / d) * solve(lcm / d, d) * input[d] % lcm; /* d > solve(lcm/d, d) */ result %= lcm; } printf("%lld\n", result); } return 0; }