不是这个段位的,跨个区凑个热闹。。
牛客编程巅峰赛S2第1场 - 钻石&王者
AB题是 牛客编程巅峰赛S2第1场 - 青铜&白银&黄金 记录&总结 中的BC题

C 牛牛算题

做带余除法,为商,为余数。

就是朴素的思路。。所以时间不是很快,达到10ms了,其他人的解法我没大看懂。。
第一次把p,k对称的部分加上,同时记录哪些已经算过了。
第二次把剩下的,用等差数列求和计算加上去。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回1-n的所有k*m的和
     * @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)/2*count%Mod;
            sum+=p;
            sum%=Mod;
        }
        return sum;
    }
};