bzoj1257 [CQOI2007]余数之和sum
2017-03-28 11:29
281 查看
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=7Input
输入仅一行,包含两个整数n, k。Output
输出仅一行,即j(n, k)。Sample Input
5 3Sample Output
7HINT
50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9正解:数学+分块。
$k \bmod i=k-\left \lfloor \frac{k}{i} \right \rfloor*i$,然后直接数论分块即可。
注意$k<n$加特判。
//It is made by wfj_2048~ #include <algorithm> #include <iostream> #include <complex> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define inf (1<<30) #define il inline #define RG register #define ll long long #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; ll n,k,lim,pos,ans; il void work(){ cin>>n>>k; lim=min(n,k); if (n>k) ans+=k*(n-k); for (RG ll i=1;i<=lim;i=pos+1){ pos=k/(k/i); if (pos>lim) pos=lim; ans+=(pos-i+1)*k-(k/i)*((i+pos)*(pos-i+1)>>1); } printf("%lld",ans); return; } int main(){ File("sum"); work(); return 0; }
相关文章推荐
- bzoj1257[CQOI2007]余数之和sum 数论
- bzoj 1257: [CQOI2007]余数之和sum
- BZOJ 1257: [CQOI2007]余数之和sum
- 【bzoj1257】【CQOI2007】【余数之和】【sum】
- BZOJ 1257[CQOI2007]余数之和sum | 数论
- 【bzoj1257】[CQOI2007]余数之和sum
- [BZOJ1257][CQOI2007]余数之和sum
- 【bzoj1257】[CQOI2007]余数之和sum
- 【BZOJ 1257】[CQOI2007]余数之和sum
- BZOJ 1257 [CQOI2007]余数之和sum
- bzoj 1257: [CQOI2007]余数之和sum
- bzoj 1257: [CQOI2007]余数之和sum 数论
- 【二分+数学】bzoj1257: [CQOI2007]余数之和sum
- 【BZOJ 1257】 [CQOI2007]余数之和sum
- 【BZOJ 1257】 [CQOI2007]余数之和sum
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
- BZOJ系列1257《[CQOI2007]余数之和sum》题解
- 【bzoj1257】[CQOI2007]余数之和sum
- BZOJ 1257 [CQOI2007]余数之和sum 数论
- [除法分块] BZOJ1257: [CQOI2007]余数之和sum