【題解】八次求和
阿新 • • 發佈:2021-12-02
✌ 2020年第十一屆省賽-題目+題解
【問題描述】
給定正整數 n, 求 1^8 + 2^8 +···+ n^8 mod 123456789 。其中 mod 表示取餘。
【輸入格式】
輸入的第一行包含一個整數 n。
【輸出格式】
輸出一行,包含一個整數,表示答案。
【樣例輸入】
2
【樣例輸出】
257
【樣例輸入】
987654
【樣例輸出】
43636805
思路
方法一:
- 這種題目是大數求和,一般的資料型別會溢位,不能用。
- 用BigInteger來處理大數。
方法二:
- 使用位運算,快速求解。
【程式碼】
解法一:
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