zoukankan      html  css  js  c++  java
  • 余数求和——除法分块

    传送门:余数求和

    本题目中需要计算 (sum_{i=1}^{n}{k mod i})

    对于 k mod i , 在写高精度取模时,曾表示为:({k}-{i} imeslfloor frac{k}{i} floor)

    故本题中,可以继续采用这种计算方式,将其拆分为:(ans=sum_{i=1}^{n}{k}-{i} imes{lfloor frac{k}{i} floor})

    进而,有:(ans={n} imes{k}-sum_{i=1}^{n}{i} imes{lfloorfrac{k}{i} floor})

    于是,对于(lfloor frac{k}{i} floor)可以用分块进行处理,取值约为:(sqrt{k})种,故复杂度约为O((sqrt{k}))

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<math.h>
    #include<algorithm>
    #define ll long long
    using namespace std;
    
    ll n,k;
    ll ans;
    
    int main(void)
    {
    	scanf("%lld%lld",&n,&k);
    	
    	ans=n*k;
    	
    	for(int l=1,r;l<=n;l=r+1)
    	{
    		if(k/l!=0) r=min(k/(k/l),n);
    		else r=n;
    		ans-=(k/l)*(r-l+1)*(l+r)/2;//当前块的t*当前块元素的个数*当前块中元素的平均值 
    	}
    	
    	printf("%lld",ans);
    	
    	return 0;
    }
    
  • 相关阅读:
    vim
    Linux 软链接和硬链接
    常用命令
    linux 二级目录结构
    关于bash shell的理解
    虚拟机网络模式
    安装虚拟机
    date 命令
    使用3种协议搭建yum仓库
    ubuntu update时发生错误
  • 原文地址:https://www.cnblogs.com/jd1412/p/13282403.html
Copyright © 2011-2022 走看看