链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299
/**************************************************
首先我们知道x、y都是大于n的数
假设y=n+k (k>=1)
带入1/x+1/y=1/n,求出x=n*(n+k)/k -> x=n^2/k + n
x固然是一个整数,所以我们只要知道n*n/k为整数的k的个数(k绝对小于n的)
即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的因子数就是cnt=(1+2*e1)*(1+2*e2)*...*(1+2*er)
***************************************************/
#include <functional> #include <algorithm> #include <string.h> #include <ctype.h> #include <stdio.h> #include <string> #include <vector> #include <queue> #include <stack> #include <cmath> #include <set> #include<cstdlib> #include<math.h> #include<iostream> #include<limits.h> #define ll long long #define ull unsigned long long #define clr(a) memset(a,0,sizeof(a)) #define maxn 40000 #define N 1000000000 using namespace std; bool isprime[40005]; int prime[40005]; void sieve(int m) { clr(isprime); for(int i = 2; i <= m; i++) { if(!isprime[i]) { for(int j = i*i; j <= m; j+=i) isprime[j] = 1; } } } void gen_prime(int n) { sieve(n); int c = 0; for(int i = 2; i <= n; i++) if(!isprime[i]) prime[c++] = i; } ll work(int num) { ll sum = 1; for(int i = 0; prime[i]<=(int)sqrt(num); i++) { int cnt = 0; while(num%prime[i]==0) { num /= prime[i]; cnt++; } sum *= (2*cnt+1); } if(num > 1) sum *= 3; return sum; } int main() { int T; scanf("%d",&T); gen_prime(maxn); for(int k = 1; k <= T; k++) { int n; scanf("%d",&n); ll ans = work(n); ans = (ans+1)/2; printf("Scenario #%d:\n%I64d\n\n",k,ans); } }