#include #include #include #define MAXN 1000000000000 #define NRUMAX 10000000 long long ru[NRUMAX]; int nru = 0; int comp(const void *a, const void *b) { long long x = *(long long*)a; long long y = *(long long*)b; if (x < y) return -1; else if (x > y) return 1; else return 0; } int main() { long long sum_repunit = 1; /* 1 is a strong repunit */ for (int base = 2; base < 1000000; base++) { long long repunit = 1 + base; long long nb = base; while (1) { nb *= base; repunit += nb; if (repunit >= MAXN) break; assert(nru < NRUMAX); ru[nru] = repunit; nru++; } } qsort(ru, nru, sizeof(long long), comp); printf("Find %d strong repunits.\n", nru + 1); for (int i = 0; i < nru; i++) { if (i > 0 && ru[i] == ru[i-1]) continue; sum_repunit += ru[i]; } printf("Their sum is %lld\n", sum_repunit); }