P2261 [CQOI2007]余数求和
题目描述
给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29
输入输出格式
输入格式:
两个整数n k
输出格式:
答案
输入输出样例
说明
30%: n,k <= 1000
60%: n,k <= 10^6
100% n,k <= 10^9
题解:
详细题解见这个博客,
搜索结果
自愧弗如
https://blog.csdn.net/nuclearsubmarines/article/details/78165951
#include <bits/stdc++.h> using namespace std; #define ll long long int main() { ll n,k; scanf("%lld%lld",&n,&k); ll ans=n*k; for (ll i = 1,r; i <=n ; i=r+1) { if(k/i!=0) r=min((k/(k/i)),n); //k>i 在一定区间内k/i的值是相同的 在此处计算出这一块的右区间 [i,r] 左闭右闭 else r=n; // 否者就全是0 ans-=(r-i+1)*(k/i)*(i+r)/2; //块大小*块内的值*i/2 } printf("%lld\n",ans); return 0; }