• bzoj 1257: [CQOI2007]余数之和sum


    Description

    给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

    Solution

    比较简单
    i>k的部分,取模值相同,答案为 ((n-k)*k)
    i<k的部分,分块做,(k/i) 相同的一组,会发现是一个以 (k/i) 为公差的等差数列,直接算即可

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define RG register
    #define il inline
    #define iter iterator
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long ll;
    void work()
    {
    	ll n,k,r;
    	cin>>n>>k;
    	ll t1,t2,ans=0,lim=min(n,k),x;
    	for(int i=1;i<=lim;i=r+1){
    		r=min(k/(k/i),n);
    		t1=k%i;t2=k%r;
    		x=(t1-t2)/(k/i);
    		ans+=(x+1)*(t1+t2)/2;
    	}
    	if(n>k)ans+=(n-k)*k;
    	cout<<ans<<endl;
    }
    int main()
    {
    	work();
    	return 0;
    }
    
    
  • 相关阅读:
    DOM对象
    多态
    封装和继承
    析构函数
    构造函数
    二维数组
    javascript的基本语法
    javascript数组
    js
    BOM和DOM的区别
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8126427.html
Copyright © 2020-2023  润新知