1. 程式人生 > >【2018 南京賽區網路賽】 An Olympian Math Problem

【2018 南京賽區網路賽】 An Olympian Math Problem

原題連結

題目翻譯:
Alice 是一個六年級的女孩,正在考慮一個奧林匹克的數學問題,但是她感覺非常沮喪所以就開始哭泣。她的同學Bob也沒有關於這道題的思路,因此他想讓你幫助他解決。這個問題是:
K:
k!=1×2×⋯×(k−1)×k
S:
S=1×1!+2×2!+⋯+
(n - 1) \times (n-1)!(n−1)×(n−1)!
最終要你求得S對n取餘的結果。
給你一個整數n,你需要計算 S mod n 的結果。

輸入:第一行包含一個整數T(T≤1000),根據測試樣例。
確保n在2≤n≤10 ^18 範圍內

輸出:S mod n
.
這道題如果直接打表做的話記憶體超限,後來搜了一下網上的解析,發現別人都是很簡單直接出的 n-1 ,看推導過程不長但是自己還是沒推出來,[/無奈] ,但是經過求助,找到一個做題方法,對於數論的題找規律打表,可以先算出前30個數的值來找規律,直接找到n-1。囉裡囉嗦一大堆,對於剛開始寫部落格,而且在做題方面還是一個小新手,想說的廢話就多啦。現在貼上別人推出來的數學過程,萬一以後某天就看懂了呢哈哈

公式為1*1!+ 2*2!+ 3*3!+...+n*n!=(n+1)!-1,本題為(n!-1)%n
因為n!-1=(n-1)*n-1=(n-2)*n+n-1,所以[(n-2)*n+(n-1)]%n=n-1n*n!=(n+1-1)n!=(n+1)n!-n!=(n+1)!-n!
所以:1*1!=2!-1!
2*2!=3!-2!
3*3!=4!-3!
n*n!=(n+1)!-n!
相加後有:1*1!+2*2!+3*3!+.+n*n!=(n+1)!-1
1*1!+2*2!+3*3!+.+n*n!=(n+1)!-1
把最後一項拆開來,變成(n+1-1)n!=(n+1)n!-n!

程式碼:

import java.math.BigInteger;
import java.util.Scanner;
public
class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int T = cin.nextInt(); while(T-- != 0) { BigInteger n = cin.nextBigInteger(); System.out.println(n.subtract(BigInteger.valueOf(1))); } } }