- 任何數字都可以被表達成質因數分解式
- b|a <=> a = kb
所以要確認某個數是否可以整除該階乘數的話,檢查該數的質因數分解的質數次方是否小於階乘數內的質數次方
假設我們想知道12是否可以整除6!
- 我們先把12分解成12 = 2^2 * 3^1
- 接下來我們呼叫一些方法來得知階乘數內的質數次方
int get_powers(n,p)
呼叫一次求2在6!的次方,得到2^4,又4 > 2
呼叫一次求3在6!的次方,得到3^2,又2 > 1
要注意以下幾點:
- 0 整除 n! 是錯誤的
- m 整除 n! 恆真當 m 小於等於 n
該如何撰寫get_powers(n,p)函式?
例如說6!中要找2的次方,我們就從1走到6,為了要紀錄有幾個次方,我們用一個power的變數來計算
當在1的時候1 % 2 != 0,無視
當在2的時候2 % 2 = 0, 這次我們就可以把power++
當在4的時候4 % 2 = 0, 我們先把power++之後再將4/2與2求餘一次,又可以再power++一次
當在6的時候6 % 2 = 0, power++
最後得到power為4回傳
/**
* Time(ZeroJudge): 94 ms
* Date: 2010-01-28
*
* @author Kurorido
*/
import java.util.Scanner;
public class JAVA {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean debug = false;
while(sc.hasNext()) {
int n = sc.nextInt();
int b = sc.nextInt();
boolean flag = true;
int[][] present = represent(b);
if(debug)
for(int i = 0; i < present.length; i++) {
for(int j = 0; j < present[i].length; j++) {
System.out.print(present[i][j] + " ");
}
System.out.println();
}
for(int i = 0; i < present.length; i++) {
if(get_powers(n, present[i][0]) < present[i][1]) {
flag = false;
break;
}
}
if(flag)
System.out.println(b + " divides " + n +"!");
else
System.out.println(b + " does not divide " + n +"!");
}
}
public static int[][] represent(int num) {
int limit = num+1;
int[] list = new int[limit];
int count = 0; // count how many primes
int max = 0; // remember max, for reuse
for(int i = 2; i < limit; i++) {
if(num % i == 0) {
count++;
max = i;
}
while(num % i == 0) {
if(num == 0)
break;
num = num / i;
list[i]++;
}
}
// make a present, use count size
int[][] present = new int[count][2];
count = 0;
// reuse max, because max is the biggest primes.
for(int i = 2; i <= max; i++) {
if(list[i] > 0) {
present[count][0] = i;
present[count][1] = list[i];
//System.out.println(present[count][0] + " " + present[count][1]);
count++;
}
}
return present;
}
public static int get_powers(int n, int p) {
if(n == 1)
return 0;
int power = 0;
for(int i = 1, num = i; i < n; i++, num++) {
while(num % p == 0) {
if(i == 0)
break;
num = num / p;
power++;
}
}
return power;
}
}
比Java排行榜的最快速度慢了20ms....等誰來改改吧= =
我的程式碼並沒有加入我所說的注意條件,如過把注意條件加入的話整個程式碼最快可以再快10ms,不過離目前最快速度還是有點距離= =
ReplyDelete