题解 | 小红的数组权值

小红的数组权值

https://www.nowcoder.com/practice/7bcd78aec6e74ebf9061245e5936c18d

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

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        BigInteger s = BigInteger.ZERO;
        BigInteger ONE = BigInteger.ONE;
        BigInteger TWO = BigInteger.valueOf(2);
        BigInteger MOD = BigInteger.valueOf(1000000007L);
        for (int i = 0; i < n; i++) {
            BigInteger I = BigInteger.valueOf(i);
            BigInteger b = ((I.add(TWO).multiply(I.add(ONE))).multiply(BigInteger.valueOf(
                                n - i)).divide(TWO));
            int a = in.nextInt();
            s = s.add(b.multiply(BigInteger.valueOf(a)));
            s = s.mod(MOD);
        }
        System.out.println(s);
    }
}

n个数,子序列用首尾两个数的下标表示,如 (x,y) 表示从ax到ay

对于第i个数ai,它的权重为k的子序列有:(i-k+1,i)、(i-k+1,i+1)、(i-k+1,i+2)、……、(i-k+1,n-1)、(i-k+1,n),一共(n-i+1)个,总共对最终的权值和贡献 k*(n-i+1)*ai

当 x<= i 时, (x,y) 包含 ai,也就是说,ai在子序列中的不同权重可以是 1、2、3、……、i-1、i,总计贡献:

(1+2+3+……+(i-1)+i)*(n-i+1) = i*(i+1)*(n-i+1)/2*ai

然后遍历每一个ai,求和即可。

使用Java的难点在于一般的int会溢出,需要大量使用BigInteger类,C++下则应该使用_int64以防止溢出

全部评论

相关推荐

06-23 23:49
中南大学 Java
成绩一坨屎,英语6级没过,没读研,没考教资,没考计算机二级,没考公,没谈过恋爱,你们说我的这个大学生涯是不是混的有点失败啊?哎老中一生的容错还是太低了下辈子一定注意混好大学生涯不留遗憾
K1einMoretti:1.不保研 成绩没太大用 2.6级没过看用人企业要求了,基本上只要4级以上 3. 读不读研看自己选择,现在这环境螚先就业就先就业 4. 你不当老师考啥教资 5. 计算机二级没用(这证纯给国家上供) 6. 订婚***案了解一下?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-25 19:15
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务