一、題目描述
假設現在有兩個自然數 A 和 B,S 是 的所有約數之和。
請你求出 S mod 9901 的值是多少。
輸入格式
在一行中輸入用空格隔開的兩個整數A和B。
輸出格式
輸出一個整數,代表S mod 9901的值。
數據範圍
輸入樣例:
2 3
輸出樣例:
15
注意: A和B不會同時爲0。
二、題解
嘗試一:暴力枚舉
使用 算法勉強可以過,但是這裏有求餘,有除法,自然很難
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
PrintWriter pw = new PrintWriter(System.out, true); //自動刷新
int A = sc.nextInt();
int B = sc.nextInt();
int T = (int) Math.pow(A, B);
int sum = 0;
for (int i = 1; i * i <= T; i++) {
if (T % i == 0) {
sum += i;
if (T/i != i)
sum += T/i;
}
}
pw.println(sum);
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,
嘗試二:快速冪(超時)
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
PrintWriter pw = new PrintWriter(System.out, true); //自動刷新
int A = sc.nextInt();
int B = sc.nextInt();
long T = quick(A, B);
int sum = 0;
for (int i = 1; i * i <= T; i++) {
if (T % i == 0) {
sum += i;
if (T/i != i)
sum += T/i;
}
}
System.out.println(sum%MOD);
}
private static int MOD = 9901;
private static long quick(int b, int p) {
long res = 1;
while (p > 0) {
if ((p & 1) == 1) {
res *= b;
}
b *= b;
p >>= 1;
}
return res;
}
}