Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.Iterator;
- /**
- * 10892 - LCM Cardinality
- * @author mohammadkotb
- *
- */
- public class LCMCardinality {
- boolean[] p;
- int[] primes;
- int size;
- int max;
- public void generate() {
- max = 1000000;
- p = new boolean[max];
- primes = new int[max];
- Arrays.fill(p, true);
- for (int i = 4; i < p.length; i+=2) {
- p[i] = false;
- }
- p[0] = false; p[1] = false;
- size = 0;
- primes[size++] = 2;
- for (int i = 3; i < p.length; i+=2) {
- if (p[i]) {
- primes[size++] = i;
- for (int j = 2*i; j < p.length; j+=i) {
- p[j] = false;
- }
- }
- }
- }
- public void run() {
- try {
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- generate();
- while (true) {
- int n = Integer.parseInt(in.readLine().trim());
- if (n == 0) {
- return;
- }
- System.out.println(n + " " + solve(n));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- int[] divisors;
- int dsz;
- int[] pows;
- int mx;
- public int solve(int n) {
- int num = n;
- int index = 0;
- pows = new int[size];
- while (num > 1) {
- while (num % primes[index] == 0) {
- num /= primes[index];
- pows[index]++;
- }
- index++;
- mx = index;
- }
- divisors = new int[max];
- dsz = 0;
- div = new HashSet<Integer>();
- rec(1, 0);
- Iterator<Integer>itr = div.iterator();
- while(itr.hasNext()) {
- divisors[dsz++] = itr.next();
- }
- int counter = 0;
- for (int i = 0; i < dsz; i++) {
- for (int j = i; j < dsz; j++) {
- if (lcm(divisors[i], divisors[j]) == n) {
- counter++;
- }
- }
- }
- return counter;
- }
- HashSet<Integer> div;
- public void rec(int curr, int ind) {
- if (ind > mx) return;
- if (pows[ind] == 0) {
- rec(curr, ind+1);
- return;
- }
- for (int i = 0; i <= pows[ind]; i++) {
- int val = (int)Math.pow(primes[ind], i);
- val *= curr;
- // divisors[dsz++] = val;
- div.add(val);
- rec(val, ind+1);
- }
- }
- public int lcm(int a, int b) {
- return a/gcd(a,b) * b;
- }
- public int gcd(int a, int b) {
- int r = a%b;
- while (r!=0) {
- a = b;
- b = r;
- r = a%b;
- }
- return b;
- }
- public static void main(String[] args) {
- new LCMCardinality().run();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement