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

1257: [CQOI2007]余数之和

时间:2018-09-23 22:41:46      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:long   line   mes   color   font   sof   pac   memory   des   

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 5999  Solved: 2879
[Submit][Status][Discuss]

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=7

Input

输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9

 

Output

输出仅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7
 
非常巧妙的数论题
首先可以推出:k%i=k-(int)(k/i)*i
根据归纳法,可以得出在一段区间内k/i的值不变
设w=(int)(k/i),而区间的右边界r=k/w
于是利用等差数列求和公式,得出ans=(r-(i-1))*k-w*(r-i+1)*(r+i)/2
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 #define LL long long
 6 
 7 LL n,k,w,r,ans;
 8 
 9 int main()
10 {
11     scanf("%lld%lld",&n,&k);
12     if(n>k)
13     {
14         ans=(n-k)*k;
15         n=k;
16     }
17     for(int i=1;i<=n;i=r+1)
18     {
19         w=k/i;r=k/w;
20         if(r>n) r=n;
21         ans+=(r-i+1)*k-w*(r-i+1)*(r+i)/2;
22     }
23     printf("%lld\n",ans);
24     return 0;
25 }

 

1257: [CQOI2007]余数之和

标签:long   line   mes   color   font   sof   pac   memory   des   

原文地址:https://www.cnblogs.com/InWILL/p/9693618.html

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