/*UVa10791 - Minimum Sum LCM ---不难发现,最优情况就是将该数素因子分解 ---需要注意几点: 1)n==1时应该输出2 2)当只有一个素因子或者没有除本身以外的素数因子时,答案等于本身+1 */ #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<cmath> #include<fstream> #include<string.h> using namespace std; typedef long long LL; const int maxn = 46340+50; const int M = 4796; //小于maxn的素数个数 //线性复杂度的Euler素数筛法 bool vis[maxn]; int prime[M]; int Euler(int n){ memset(vis, 0, sizeof(vis)); int phi = 0; for (int i = 2; i <= n; i++){ if (!vis[i]) prime[phi++] = i; //i是素数 for (int j = 0; j < phi&&i*prime[j] <= n; j++){ vis[i*prime[j]] = 1; //筛去 if (i%prime[j] == 0)break; //i是合数(当前是合法的),并且这个数已经被筛过 } } return phi; //返回素数个数 } int main(){ int cnt, iCase = 1, i, n, k,r; int m = Euler(maxn); /*ifstream fin("a.txt"); ofstream fout("b.txt"); while (){ while (fin>>n&&n){*/ while (scanf("%d", &n) && n){ cnt = 0; //记录因子个数 k = n; LL ans = 0; for (i = 0; i < m; i++){ if (k%prime[i] == 0)cnt++; r = 1; while (k%prime[i] == 0){ k /= prime[i]; r *= prime[i]; } if (r>1)ans += r; if (k == 1)break; } //cnt==0说明该数是一个超过素数表的大素数 if (cnt == 0)ans = LL(n) + 1; //是一个大素数 else if (cnt == 1 && k == 1)ans = LL(n + 1); //说明只有一个因子,k==1保准n已经除尽 else if (k > 1)ans = ans + k; //说明n还没有除尽,k是n的一个大素数因子 printf("Case %d: %lld ", iCase++,ans); } return 0; }