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

猜你喜欢

转载自blog.csdn.net/qq_42736065/article/details/82711938