CQOIX2007余数之和

朴素能得个差不多吧……

这题改进算法真恶心

pascal一直过不了,难道非得转c++?

代码:(pascal)

 1 var n,k,i,l,r,m:longint;
 2     ans:qword;
 3 function ceil(x:real):longint;
 4  begin
 5  if trunc(x)<x then exit(trunc(x)+1) else exit(trunc(x));
 6  end;
 7 procedure main;
 8  begin
 9    readln(n,k);
10    ans:=0;
11    if n>k then
12     begin
13      inc(ans,(n-k)*k);
14      n:=k;
15     end;
16    m:=ceil(sqrt(k));
17    for i:=1 to m do inc(ans,k mod i);
18    for i:=1 to m do
19     begin
20       l:=(k div (i+1))+1;
21       r:=(k div i);
22       if l<=m then l:=m+1;
23       if r>n then r:=n;
24       if r<l then continue;
25       inc(ans,(((k<<1)-i*(l+r))*(r-l+1)>>1));
26     end;
27    writeln(ans);
28  end;
29 begin
30   main;
31 end.    

代码:(c++)

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4
 5 long long ans,n,k;
 6 int main() {
 7   ios::sync_with_stdio(false);
 8   cin>>n>>k;
 9   if (n>k) {
10     ans+=k*(n-k);
11     n=k;
12   }
13   long long sqrtk=ceil(sqrt(k));
14   for (long long i=1;i<=sqrtk;++i) ans+=k%i;
15   for (long long a=1;a<=sqrtk;++a) {
16     long long L=floor(k/(a+1))+1;
17     long long R=floor(k/a);
18     if (L<=sqrtk) L=sqrtk+1;
19     if (R>n) R=n;
20     if (R<L) continue;
21     ans+=((k<<1)-a*L-a*R)*(R-L+1)>>1;
22   }
23   cout<<ans;
24 }

另一种分块方法,pascal还是过不了……

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <algorithm>
 4
 5 long long n, k, ans;
 6 int main()
 7 {
 8   scanf("%lld%lld", &n, &k);
 9   if (n > k)
10   {
11     ans += (n-k)*k;
12     n = k;
13   }
14   ans += n * k;
15   for (long long i = 1, last; i <= n; i = last+1)
16   {
17     last = std::min(n, k/(k/i));
18     ans -= (k/i) * (i+last) * (last-i+1) / 2;
19   }
20   printf("%lld", ans);
21 }

CQOIX2007余数之和,布布扣,bubuko.com

时间: 2024-11-02 22:53:33

CQOIX2007余数之和的相关文章

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

余数之和sum

余数之和sum Time Limit:5000MS   Memory Limit:165888KB   64bit IO Format:%lld & %llu SubmitStatus 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

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] 余数之和

题目链接题意: 给定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 数学 &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)) --------------

【BZOJ1257】余数之和(数论分块,暴力)

[BZOJ1257]余数之和(数论分块,暴力) 题解 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. Output 输出仅一行,即j(n, k). Sample Input

bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum

http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #include<cstdio> #include<iostream> using namespace std; int main() { int n,k; scanf("%d%d",&n,&k); long long ans=0; if(n>k) { an

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&