#include #include #define MAX 1*1000*1000 int sieve[1+MAX]; int main() { memset(sieve, 0, sizeof(sieve)); sieve[1]=1; int maxtau = 0; for (int n=2; n<=MAX; n++) { if (!sieve[n]) { int m = n; while (m<=MAX) { sieve[m] = n; m += n; } } int power = 0; int prime = sieve[n]; int rem = n; while (rem%prime==0) { rem /= prime; power++; } sieve[n] = (1+power)*sieve[rem]; if (maxtau first[tau]) { bestn = first[tau]; besttau = tau; } } } } if (bestn) { printf("%d %d\n", n, bestn); seen[prevtau][besttau] = true; first[besttau] = sieve[first[besttau]]; prevtau = besttau; } else { break; } } return 0; }