先把n的因子全部列出来并从小到大排序,然后枚举 这里用到一个结论,两个数的乘积等于这两个数最小公倍数和最大公因数的乘积
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long d[1005];
int m;
void div(long long k){
m=0;
long long t=sqrt(k);
for(int i=1;i<=t;i++){//如果写成i<=k会TLE
if(k%i==0) {
d[m++]=i;
if(k/i!=i) d[m++]=k/i;//所以这是一个小技巧,比如k=12 则d数组为{1,12,2,6,3,4}之后再进行排序
}
}
sort(d,d+m);
}
long long gcd(long long a,long long b){
return b==0 ? a:gcd(b,a%b);//求最大公因数的递归写法
}
int main(){
int n;
while(cin>>n&&n!=0){
int ans=0;
div(n);
for(int i=0;i<m;i++){
for(int j=i;j<m;j++){
if(d[i]*d[j]/(gcd(d[i],d[j]))==n) ans++;
}
}
cout<<n<<" "<<ans<<endl;
}
return 0;
}