[关闭]
@rebirth1120 2019-11-14T09:58:48.000000Z 字数 519 阅读 834

余数之和 解题报告

解题报告


算法进阶指南 余数之和

题意

给定正整数 ,
.

思路

可以变为 ,
这一坨可以数论分块, 每次再求个等差序列和就好了.

代码

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. int n,x;
  5. ll ans;
  6. ll sum(ll a,ll b){ return (a+b)*(b-a+1)/2; }
  7. int main(){
  8. // freopen("som.in","r",stdin);
  9. cin>>n>>x;
  10. for(int i=1;i*i<=x;i++){
  11. if(i<=n&&x/i!=i){ ans+=x%i; }
  12. if(x/(i+1)>=n) continue;
  13. int a=min(x/i,n),b=x/(i+1)+1;
  14. ans+=(ll)(a-b+1)*x-sum((ll)b,(ll)a)*i;
  15. }
  16. if(n>x) ans+=(ll)(n-x)*x;
  17. printf("%lld\n",ans);
  18. return 0;
  19. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注