把n的所有因子求出来,总数不会太多,所以直接O(n2)的暴力枚举所有对行不行。
有几个细节要注意,详见代码。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<stack> #include<queue> using namespace std; #define INF 1000000000 #define eps 1e-8 #define pii pair<int,int> #define LL long long int LL n; LL ans; LL a[5000]; LL gcd(LL a,LL b){return b==0?a:gcd(b,a%b);} int main() { //freopen("in6.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%lld",&n)&&n) { int k=0,tn=sqrt(n); ans=0; for(int i=1;i<=tn;i++) { if(n%i==0) { a[k++]=i; if((n/i)!=i)//这一句没加WA了一次 a[k++]=n/i; } } for(int i=0;i<k;i++) { for(int j=i;j<k;j++)//注意是从i开始枚举j,这样避免重复 { if(gcd(a[i],a[j])*n==a[i]*a[j])//注意这么乘起来可能超int,所以都开成LL { ans++; } } } printf("%lld %lld\n",n,ans); } //fclose(stdin); //fclose(stdout); return 0; }
时间: 2024-10-14 12:34:53