牛客编程巅峰赛:牛牛算题(整数分块)

编程入门 行业动态 更新时间:2024-10-11 01:16:28

牛客编程巅峰赛:牛牛算题(<a href=https://www.elefans.com/category/jswz/34/1771264.html style=整数分块)"/>

牛客编程巅峰赛:牛牛算题(整数分块)

链接:
来源:牛客网
 

题目描述

牛牛的数学老师教会了牛牛除法,牛牛十分开心,他知道任意一个正整数都可以表示为n=p×k+m (k 为商,m为余数) 的方式,现在死脑筋的牛牛想要计算对于小于等于n的每一个数p(p≥1), 计算所有 k×m 的和。这可难倒了牛牛,请你来帮帮他吧。(由于答案可能过大,请对10^9+7取模)

 

示例1

输入

1

返回值

0

说明

1 = 1*1 + 0

示例2

输入

5

返回值

5

说明

5=1*5+0 , 5=2*2+1, 5=3*1+2,5=4*1+1,5=5*1+0 ;ans =5*0+2*1+1*2+1*1+1*0= 5

备注:

1≤n≤INTMAX1

思路:本题考查整数分块的知识。先盗用一张题解中的图【出处来自:=139471】:

对于n/p从1到n求和,我们发现这正是整数分块可以解决的东西,并且已经有博客证明,该复杂度是根号级别的。

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 返回1-n的所有k*m的和* @param num long长整型 正整数 n* @return long长整型*/private static final int mod=1000000007;public long cowModCount (long num) {// write code herelong ans=0,i,j,k,n=num;for(i=1;i<=n;i=j+1){k=n/i;j=n/k;ans=(ans+n*k%mod*(j-i+1)%mod)%mod;ans=(ans-k*k%mod*((i+j)*(j-i+1)/2%mod)%mod+mod)%mod;}return ans;}
}

 

更多推荐

牛客编程巅峰赛:牛牛算题(整数分块)

本文发布于:2024-03-14 19:38:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1737182.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:整数   巅峰   牛牛   算题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!