首先把n分解成2, 3, 5, 7相乘的形式.然后通过二进制枚举各个因子相乘的组合.
#include <memory.h>
#include <cstdio>
using namespace std;
const int p[4] = {2, 3, 5, 7};
int expo[4], exp_idx;
int main(){
long long n;
while(~scanf("%I64d", &n) && n){
memset(expo, 0, sizeof(expo));
exp_idx = 0;
int ans = 0;
for(int i = 0; i < 4 && n > 1; ++i){
if(n % p[i] == 0){
while(n % p[i] == 0){
++expo[exp_idx];
n /= p[i];
}
++exp_idx;
}
}
int b = 1;
for(int i = 0; i < exp_idx; b <<= 1, ++i);
for(int i = 0; i < b; ++i){
int t = 1;
for(int j = i, idx = 0;j; j >>= 1,idx++){
if(j & 1){
t *= expo[idx];
}
}
ans += t;
}
printf("%d\n", ans);
}
return 0;
}