【數論 G】B000_約數之和(枚舉 | 快速冪)

一、題目描述

假設現在有兩個自然數 A 和 B,S 是 ABA^B 的所有約數之和。

請你求出 S mod 9901 的值是多少。

輸入格式
在一行中輸入用空格隔開的兩個整數A和B。

輸出格式
輸出一個整數,代表S mod 9901的值。

數據範圍

  • 0A,B5×1070≤A,B≤5×10^7
輸入樣例:
2 3
輸出樣例:
15
注意: A和B不會同時爲0。

二、題解

嘗試一:暴力枚舉

10710^7 使用 O(n)O(n) 算法勉強可以過,但是這裏有求餘,有除法,自然很難

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);
	}
}

複雜度分析

  • 時間複雜度:O(n)O(根號 n)
  • 空間複雜度:O(1)O(1)

嘗試二:快速冪(超時)

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;
	}
}

方法二:奧數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章