bzoj1257[CQOI]余数之和
2015-07-18 21:25
417 查看
题目:
Submit: 2383 Solved: 1105
[Submit][Status][Discuss]
题解:
根据n/i将1~n分成几组,每组的n/i值相同,n%i的值呈等差数列。
例如 当n=20,k=15时
商为15的:1;
商为7的:2;
商为5的:3;
商为3的:4,5;
商为2的:6,7;//余数等差
商为1的:8,9,10,11,12,13,14,15;//余数等差
商为0的:16,17,18,19,20;
固我们只需找出每段商相等的数字的起始和末尾,即可通过等差数列的求和公式相加得到答案。
以下为代码:
1257: [CQOI2007]余数之和sum
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 2383 Solved: 1105
[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=7Input
输入仅一行,包含两个整数n, k。Output
输出仅一行,即j(n, k)。Sample Input
5 3Sample Output
7HINT
50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9Source
数论题解:
根据n/i将1~n分成几组,每组的n/i值相同,n%i的值呈等差数列。
例如 当n=20,k=15时
商为15的:1;
商为7的:2;
商为5的:3;
商为3的:4,5;
商为2的:6,7;//余数等差
商为1的:8,9,10,11,12,13,14,15;//余数等差
商为0的:16,17,18,19,20;
固我们只需找出每段商相等的数字的起始和末尾,即可通过等差数列的求和公式相加得到答案。
以下为代码:
#include<iostream> #include<cstdio> #include<cmath> #define LL long long using namespace std; int main() { int n,k; scanf("%d%d",&n,&k); LL ans=0; int now=1; int minn=min(n,k); while(now<=minn) { int div=k/now; int final=k/div; ans+=((LL)(k%now+k%final)*(final-now+1)/2); if(final>minn) { ans-=((LL)(k%final+k%(minn+1))*(final-minn)/2); } now=final+1; } if(n>k) ans+=((LL)(n-k)*k); printf("%lld\n",ans); return 0; }
相关文章推荐
- ZOJ 2104 Let the Balloon Rise
- poj3984-迷宫问题(广搜)
- Android学习笔记之dispatchTouchEvent和OnInterceptTouchEvent和OnTouchEvent三个方法之间的联系...
- Eddy's research I
- 【Spark Core】TaskScheduler源码与任务提交原理浅析1
- 每个程序员都需要了解的一个SQL技巧
- SWIFT中获取配置文件路径的方法
- 迭代器模式
- git使用的基础及常用命令
- ACdream 1727 Sequence
- 添加view类图中的二级菜单
- IntelliJ公司版破解方法
- LeetCode-Add and Search Word - Data structure design(C++)
- Java HashMap 的实现原理详解
- odoo联调补充
- 简单理解锁
- 1289 大鱼吃小鱼
- LeetCode: Rotate Array
- HDU 1233 还是畅通工程(Prim求最小生成树)
- 用这些专用工具让你截图更简单