码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1257 [CQOI2007]余数之和sum

时间:2018-01-19 23:32:02      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:数列   scan   str   ace   pos   一段   log   i+1   nbsp   

我们要求∑k%i

可以化简为∑n*k-i*(k/i)

所以问题在于如何求∑k/i*i

数据范围1e9,想一想O(n)不可做

加入n=k=15

  i=  1   2   3   4   5   6   7   8   9   10   11   12   13   14   15

k/i=15  7   5   3   3   2   2   1   1    1     1  . . . . . . . . .

所以可以看出k/i是单调递减的,且对于每一段相同的k/i他们的区间是k/(k/i)到k/(k/(i+1))-1,再用等差数列算一下就可以了

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 int main() {
 8     ll n,k;
 9     scanf("%lld%lld",&n,&k);
10     ll ans=n*k;
11     for(ll l=1,r;l<=n;l=r+1) {
12         if(k/l!=0) r=min(k/(k/l),n); 
13         else r=n;
14         ans-=(k/l)*(r-l+1)*(l+r)/2;
15     }
16     printf("%lld",ans);
17     return 0;
18 }

 

BZOJ1257 [CQOI2007]余数之和sum

标签:数列   scan   str   ace   pos   一段   log   i+1   nbsp   

原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8318964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!