1257: [CQOI2007]余数之和

1257: [CQOI2007]余数之和

https://www.lydsy.com/JudgeOnline/problem.php?id=1257

分析:

$\sum\limits_{n=1}^N k \ mod\ n$

当n > k时,k mod n都是k,所以直接求就好了。

另一种情况:

$\sum\limits_{n=1}^N k - \frac{k}{n} \times n$

然后对于$\frac{k}{n}$这里进行分块。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4
 5 LL get(int l,int r) {
 6     l --;
 7     LL t1 = 1ll * (l + 1) * l / 2; // long long
 8     LL t2 = 1ll * (r + 1) * r / 2;
 9     return t2 - t1;
10 }
11
12 int main() {
13
14     int n,k; cin >> n >> k;
15     LL ans = 0;
16     if (n > k) {
17         ans += 1ll * (n - k) * k;n = k;
18     }
19     int pos;
20     for (int i=1; i<=n; i=pos+1) {
21         pos = k / (k / i);
22         if (pos > n) pos = n;
23         ans += 1ll * k * (pos - i + 1);
24         ans -= 1ll * (k / i) * get(i,pos);
25     }
26     cout << ans;
27     return 0;
28 }

原文地址:https://www.cnblogs.com/mjtcn/p/9351490.html

时间: 2024-11-05 17:27:08

1257: [CQOI2007]余数之和的相关文章

1257: [CQOI2007]余数之和sum

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2001  Solved: 928[Submit][Status] 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

BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4474  Solved: 2083[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

bzoj 1257: [CQOI2007]余数之和sum 数学 &amp;&amp; 枚举

1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Status] 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

BZOJ 1257: [CQOI2007]余数之和sum( 数论 )

n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i)  = ∑  , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连续的数对答案的贡献成等差数列, 可以O(1)求出..然后就分⌊k / i⌋ 相等的一块一块来就行了. 分出来大概是sqrt(k)块.这个sqrt(k)我并不会证Orz...写了个程序验证了一下, 分出来的块数和2 * sqrt(k)非常接近. 所以时间复杂度为O(sqrt(k)) --------------

[原博客] BZOJ 1257 [CQOI2007] 余数之和

题目链接题意: 给定n,k,求 ∑(k mod i) {1<=i<=n} 其中 n,k<=10^9. 即 k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 我们先来看商之和. 给定n,k,求∑(k/i) {1<=i<=n} 其中/为整除. 可以得到一个引理,k/i值的个数不超过2*√k种.证明:k整除小于√k的数,都会有一个不同的结果:k整除大于√k的数,结果肯定小于√k,所以最多也只能有√k种结果. 于是我们可以枚举结果的取值累加.是

BZOJ 1257 [CQOI2007]余数之和sum(计数优化)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1257 [题目大意] 给出正整数n和k,计算j(n,k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值 [题解] 我们发现k%i=k-[k/i]*i,j(n,k)=n*k-∑[k/i]*i,我们知道[k/i]的取值不超过k^(1/2)个, 并且在分布上是连续的,所以我们可以分段求和,对于段开头l,其段结尾r=k/[k/l]. [代码] #inc

[BZOJ 1257] [CQOI2007] 余数之和sum 【数学】

题目链接:BZOJ - 1257 题目分析 首先, a % b = a - (a/b) * b,那么答案就是 sigma(k % i) = n * k - sigma(k / i) * i     (1 <= i <= n) 前面的 n * k 很容易算,那么后面的 sigma(k / i) * i,怎么办呢? 我们可以分情况讨论,就有一个 O(sqrtk) 的做法. 1)当 i < sqrtk 时,直接枚举算这一部分. 2)当 i >= sqrtk 时, k / i <=

bzoj 1257 : [CQOI2007]余数之和 (数学+分块)

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

bzoj 1257 [CQOI2007]余数之和——数论分块

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( n\%i = n - \left \lfloor n/i \right \rfloor * i \) 注意 n<k 时当前块的右端点可能超过 n ! #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; in