1257: [CQOI2007]余数之和

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 }
复制代码

 

posted @   InWILL  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
历史上的今天:
2016-09-23 NOIP2010 引水入城
点击右上角即可分享
微信分享提示