百度AI小课堂-矩阵问题

    xiaoxiao2025-06-12  23

    题目名称:百度AI小课堂-矩阵问题

    题目链接:百度AI小课堂-矩阵问题

    描述

    一个同学 LSQ 在小课堂后对矩阵产生极大的感兴趣,他想到了一个对矩阵求和的问题,但是这个矩阵实在太大了,他算不过来,你能帮帮他吗?

    这个矩阵长这个样子,其右方和下方是没有边界的,但是不要担心,他并不要求你对整个矩阵求和,他只想知道,第 aaa 行第 ccc 列的格子为左上,第 bbb 行第 ddd 列的格子为右下的子矩阵中所有元素的和是多少?

    方便起见,请将答案乘 222,再对 332748118332748118332748118 取模后输出 1 2 3 4 5 6 7 8 9 … 2 3 4 5 6 7 8 9 10 … 3 4 5 6 7 8 9 10 11 … 4 5 6 7 8 9 10 11 12 … 5 6 7 8 9 10 11 12 13 … 6 7 8 9 10 11 12 13 14 … 7 8 9 10 11 12 13 14 15 … 8 9 10 11 12 13 14 15 16 … 9 10 11 12 13 14 15 16 17 … … … … … … … … … … …

    输入格式

    一行输入四个整数a,b,c,d

    输出格式

    一行一个整数表示答案。

    数据范围

    a<b<10^18 ,c<d<10^18

    样例输入

    1 3 4 6

    样例输出

    108

    解题思路

    一个简单的数学问题,只需要将矩阵内相应的数据相加就可以了,先计算出矩阵最上方一行的和,接下来和下一行相加,由于矩阵每行数据都比上一行大一,所以还需额外加上(d-c+1),然后就成了简单的数学问题,刚开始使用C++的长整型去解题,不过程序没有通过,后来调试了半天发现10^18不再长整型的范围之内,于是改成了Java,顺利通过了

    代码如下

    import java.math.BigInteger; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner input=new Scanner(System.in); BigInteger a=input.nextBigInteger(); BigInteger b=input.nextBigInteger(); BigInteger c=input.nextBigInteger(); BigInteger d=input.nextBigInteger(); BigInteger f=new BigInteger("2"); BigInteger e=new BigInteger("1"); BigInteger s=new BigInteger("332748118"); BigInteger beg=a.add(c).subtract(e); BigInteger en=a.add(d).subtract(e); BigInteger ans=beg.add(en).multiply(d.subtract(c).add(e)).divide(f); BigInteger sum=ans.multiply(b.subtract(a).add(e)).add(b.subtract(a).multiply(b.subtract(a).add(e)).divide(f).multiply(d.subtract(c).add(e))); System.out.println(sum.multiply(f).remainder(s)); } }

    写在最后

    原谅我其他题暂时没有思路

    最新回复(0)