/* 首先我们知道x、y都是大于n的数 假设 x = n + k (1 <= k <= n && x <= y) 代入1 / x + 1 / y = 1 / n,求出 y = n * (n + k) / k -> y = n^2 / k + n y肯定是一个整数,所以我们只要知道n * n / k为整数的k的个数 其实题目就是求n * n 的因子的个数 每一个数都能分解成n=p1^e1*p2^e2*p3^e3...pr^er p1....pr是小于n的素数 因子数就是 num = (1+e1)*(1+e2)*(1+e3)*....*(1+er) n*n的因子数就是 sum = (1+2*e1)*(1+2*e2)*...*(1+2*er 结论:一个整数的所有因子数等于其每个素因子的个数加一之后的乘积(1+p1)(1+p2)…(1+pn), 其中p1、p2、...、pn分别为该整数的所有n个素因子P1、P2、...Pn的相应个数。 (包含本身) 还有一个犀利的结论:因子和: 若 k=p1^a1*p2^a2...*pi^ai F(k) = (p1^0+...+p1^a1)*(p2^0+...+p2^a2)*...*(pi^0 + ... + pi^ai) */ #include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; const int N = 100005; bool hash[N]; int prime[N/2]; int p; inline void Prime() { memset(hash, false, sizeof(hash)); for(int i = 2; i < sqrt(1.0 * N); i++) if(!hash[i]) for(int j = 2; j * i < N; j++) hash[j * i] = true; p = 0; for(int i = 2; i < N; i++) { if(!hash[i]) { prime[p++] = i; } } } int main() { int t; Prime(); scanf("%d", &t); for(int i = 1; i <= t; i++) { int n; scanf("%d", &n); int sum = 1; for(int j = 0; j < p; j++) { if(prime[j] > n) break; if(n % prime[j] != 0) continue; int num = 0; while(n % prime[j] == 0) { n /= prime[j]; num++; } sum *= (2 * num + 1); } if(n > 1) // 有一个大于sqrt(n) 的素因子 sum *= 3; printf("Scenario #%d:/n", i); printf("%d/n/n", (sum + 1) / 2);// 每个数都是两两配对的 } return 0; }