1. 程式人生 > 其它 >【題解】八次求和

【題解】八次求和

✌ 2020年第十一屆省賽-題目+題解

【問題描述】

給定正整數 n, 求 1^8 + 2^8 +···+ n^8 mod 123456789 。其中 mod 表示取餘。

【輸入格式】

輸入的第一行包含一個整數 n。

【輸出格式】

輸出一行,包含一個整數,表示答案。

【樣例輸入】

​ 2

【樣例輸出】

​ 257

【樣例輸入】

​ 987654

【樣例輸出】

​ 43636805

思路

方法一:

  1. 這種題目是大數求和,一般的資料型別會溢位,不能用。
  2. 用BigInteger來處理大數。

方法二:

  1. 使用位運算,快速求解。

【程式碼】

解法一:

import java.math.BigInteger;
import java.util.Scanner;

public class topic07 {
    public static void main(String[] args) {
        BigInteger begin; // 記錄每次遍歷的數,並對其未8次冪
        BigInteger sum = BigInteger.ZERO; // 0 , 記錄每次求和結果

        System.out.print("請輸入n:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        // 遍歷求和
        for (int i = 1; i <= n; i++) {
            begin = BigInteger.valueOf(i).pow(8);// 對每個數未8次冪
            sum = sum.add(begin); // 求和
        }

        String model = "123456789";

        //對結果mod123465789並列印輸出
        System.out.println(sum.mod(new BigInteger(model)));
    }
}

解法二:

import java.util.Scanner;

public class topic07_2 {
    static long mod_number = 123456789;//題目要求

    public static void main(String[] args) {
        System.out.print("請輸入一個數:");
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        long sum = 0; // 記錄所求的數

        for (long i = 1; i <= n; i++) {
            sum = (sum + quickPow(i, 8)) % mod_number;
        }
        System.out.println(sum);
    }

    // 快速求冪
    static long quickPow(long n, long pow) {
        long sum = 1;
        while (pow > 0) {

            // 結果賦值條件。
            if ((pow & 1) == 1) {
                sum = (sum * n) % mod_number;
            }

            n = (n * n) % mod_number;
            pow >>= 1;//移位運算
        }
        return sum; // 返回冪運算結果
    }
}

結果

43636805