E - LCM Cardinality
A pair of numbers has a unique LCM but a single number can be the LCM of more than one possible pairs. For example 12 is the LCM of (1, 12), (2, 12), (3,4) etc. For a given positive integer N, the number of different integer pairs with LCM is equal to N can be called the LCM cardinality of that number N. In this problem your job is to find out the LCM cardinality of a number.
Input The input file contains at most 101 lines of inputs. Each line contains an integer N (0 < N ≤ 2∗109). Input is terminated by a line containing a single zero. This line should not be processed.
Output
For each line of input except the last one produce one line of output. This line contains two integers N and C. Here N is the input number and C is its cardinality. These two numbers are separated by a single space.
Sample Input
2 12 24 101101291 0
Sample Output
2 2 12 8 24 11 101101291 5
首先,看到這道題我以為有什麼巧妙的數學方法,結果是暴力。。。
先求出所有約數,判斷是否相同,放到一個數組裡,再一個個試,可以直接用__gcd()(注意)。排除n=1的時候不符合情況。
還有在for 語句中如果初始條件不滿足判斷條件也不會執行。
#include<bits/stdc++.h> using namespace std; int a[1000000]; int main() { int m,n; while(cin>>m) { if(m==0) break; else if(m==1) { cout<<1<<" "<<1<<endl; } else { int start=0;int sum=2; for(int i=2;i<=sqrt(m);i++) { if(m%i==0) { //cout<<"kao"<<endl; a[start++]=i; if(m/i!=i) a[start++]=m/i; } } sum+=start; for(int i=0;i<start;i++) { for(int j=i+1;j<start;j++) { if(a[i]*a[j]==__gcd(a[i],a[j])*m) { sum++; } } } cout<<m<<" "<<sum<<endl; } } return 0; }