1. 程式人生 > >1257: [CQOI2007]余數之和

1257: [CQOI2007]余數之和

sin geo bit hit turn wrap times color port

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 }

1257: [CQOI2007]余數之和