<!-- wp:paragraph -->
<p>不是这个段位的,跨个区凑个热闹。。
牛客编程巅峰赛S2第1场 - 钻石&王者
AB题是 牛客编程巅峰赛S2第1场 - 青铜&白银&黄金 记录&总结 中的BC题</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2>C 牛牛算题</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>对$latex n$做带余除法,$latex k$为商,$latex m$为余数。
$latex n=p*k+m,\quad p=1,\dots,n$
求$latex \sum_p k\cdot m \, \rm{mod} (10^9+7)$</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>就是朴素的思路。。所以时间不是很快,达到10ms了,其他人的解法我没大看懂。。
第一次把p,k对称的部分加上,同时记录哪些已经算过了。
第二次把剩下的,用等差数列求和计算加上去。</p>
<!-- /wp:paragraph -->
<!-- wp:code -->
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
返回1-n的所有km的和
* @param num long长整型 正整数 n
* @return long长整型
*/
typedef long long LL;
const LL Mod=1e9+7;
long long cowModCount(long long num) {
// write code here
LL sum=0,m=floor(sqrt(num));
LL vec[2*m],tmp;
for(LL i=1;i<=m;i++){
tmp=num/i;
vec[i-1]=i;
vec[2*m-i]=tmp;
if(tmp!=i){
sum+=(i+tmp)*(num%i)%Mod;
}else{
sum+=(i)*(num%i)%Mod;
}
sum%=Mod;
}
LL count=0;
for(LL i=2*m-1;i>=1;i--){
if(vec[i]==vec[i-1]||vec[i]==vec[i-1]+1){
count++;
continue;
}else{
count++;
}
LL a=num%(vec[i-1]+1),b=num%(vec[i]-1);
LL p=(a+b)(vec[i]-vec[i-1]-1)/2count%Mod;
sum+=p;
sum%=Mod;
}
return sum;
}
};
<!-- /wp:code -->