只要求出n的所有约数,然后枚举一对约数看其最小公约数是否是n即可。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#define MAXN 505
#define MOD 1000000007
#define INF 2139062143
#define ll long long
using namespace std;
int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
vector<int> vec;
int m=sqrt(n);
for(int i=1; i<=m; ++i)
{
if(n%i==0)
{
if(i==n/i)
vec.push_back(i);
else
{
vec.push_back(i);
vec.push_back(n/i);
}
}
}
sort(vec.begin(),vec.end());
int ans=0;
for(int i=0; i<vec.size(); ++i)
for(int j=i; j<vec.size(); ++j)
if(lcm(vec[i],vec[j])==n)
ans++;
printf("%d %d\n",n,ans);
}
return 0;
}