zoukankan      html  css  js  c++  java
  • LUOGU P2261 [CQOI2007]余数求和(数论分块)

    传送门

    解题思路

      数论分块,首先将 (k\%a) 变成 (k-a*leftlfloordfrac{k}{a} ight floor)形式,那么(sumlimits_{i=1}^nk\%i=n*k-sumlimits_{i=1}^ni*leftlfloordfrac{k}{i} ight floor),这样的话因为(leftlfloordfrac{k}{i} ight floor)的取值只有(O(sqrt n))级别,所以可以每次找到相等值的左端点和右端点,用一次等差数列求和公式即可。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    typedef long long LL;
    
    int n,k;
    LL ans;
    
    int main(){
       scanf("%d%d",&n,&k);ans=(LL)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-=(LL)(k/l)*(r-l+1)*(l+r)/2;
       }
       cout<<ans;
       return 0;
    } 
    
  • 相关阅读:
    软件工程实践总结
    用户使用调查报告
    Beta 冲刺 随笔合集
    Beta 冲刺 七
    Beta 冲刺 六
    Beta 冲刺 五
    Beta 冲刺 四
    Beta 冲刺 三
    Beta 冲刺 二
    Beta 冲刺 一
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9791167.html
Copyright © 2011-2022 走看看