博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 1363 (数论 数列求和) Joseph's Problem
阅读量:5270 次
发布时间:2019-06-14

本文共 1549 字,大约阅读时间需要 5 分钟。

题意:

给出n, k,求

分析:

假设,则k mod (i+1) = k - (i+1)*p = k - i*p - p = k mod i - p

则对于某个区间,i∈[l, r],k/i的整数部分p相同,则其余数成等差数列,公差为-p

 

然后我想到了做莫比乌斯反演时候有个分块加速,在区间[i, n / (n / i)],n/i的整数部分相同,于是有了这份代码。

1 #include 
2 #include
3 using namespace std; 4 typedef long long LL; 5 6 int main() 7 { 8 LL n, k; 9 while(scanf("%lld%lld", &n, &k) == 2)10 {11 LL ans = 0;12 LL i, j, r = min(n, k);13 for(i = 1; i <= r; i = j + 1)14 {15 j = k / (k / i);16 if(j > r) j = r;17 18 LL d = -k / i;19 LL l = j - i + 1;20 LL a1 = k % i;21 ans += (LL) (a1*l + l*(l-1)/2*d);22 }23 if(n > k)24 ans += (LL) (n-k) * k;25 26 printf("%lld\n", ans);27 }28 29 return 0;30 }
代码君

 

后来试了一下lrj的代码,比我的短还比我的快,给跪了

1 // UVa1363 Joseph's Problem 2 // Rujia Liu 3 #include
4 #include
5 using namespace std; 6 7 // 首项为a,公差为-d,除了首项之外还有n项 8 // 末项为a-n*d,平均数为(2*a-n*d)/2 9 long long sum(int a, int d, int n) {10 return (long long)(2*a-n*d)*(n+1)/2;11 }12 13 int main() {14 int n, k;15 while(cin >> n >> k) {16 int i = 1;17 long long ans = 0;18 while(i <= n) {19 int q = k % i, p = k / i;20 int cnt = n - i; // 最多还有n - i项21 if(p > 0) cnt = min(cnt, q / p); 22 ans += sum(q, p, cnt);23 i += cnt + 1;24 }25 cout << ans << "\n";26 }27 return 0;28 }
更快的代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4198215.html

你可能感兴趣的文章
复杂问题的简单抽象:魔兽世界中的兔子们
查看>>
UVA 10529-Dumb Bones(概率dp)
查看>>
关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
查看>>
MyEclipse DB Browser使用图文全攻略
查看>>
poj3320 Jessica's Reading Problem(尺取思路+STL)
查看>>
A - Vasya and Socks
查看>>
项目管理、设计开发、代码管理、bug管理工具介绍
查看>>
分布式计算开源框架Hadoop介绍
查看>>
安卓平台接口剖析
查看>>
linux文件编码查看与修改
查看>>
[Java] 系统环境变量配置
查看>>
坏的事情不都会带来坏的结果
查看>>
RPC的基础:调研EOS插件http_plugin
查看>>
HIT1946 希尔伯特分形曲线(dfs)
查看>>
第二次团队冲刺第二天
查看>>
青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 2
查看>>
bzoj 2257 (JSOI 2009) 瓶子与燃料
查看>>
11)Java abstract class 和 interface
查看>>
使用xrdp或Xmanager 远程连接 CentOS6
查看>>
SEH简单研究
查看>>