Luogu2261[CQOI2007]余数求和 【数论】By cellur925

题目传送门

省选题竟然送了这么多分,60分直接暴力算就行。(算了,07年的省选)

数学题嘛,通常我们需要把式子展开,然后寻找一些性质化简=w=。

展开式以及寻找规律的过程lyd老师讲的很清楚T_T,放照片了...

如果不能冷静分析,理论证明,我们还可以打表呀

一位dalao的打表法

发现了k/i在一定范围内是相等的后,我们就可以降低复杂度了,x是我们当前到的i(增强了效率),gu是相同值组成的块的右端点,之后我们就可以用等差数列算出sigma下标,问题得解。这也是除法分块的一个方法技巧。

细节:防止整数被0处,特判一下。

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 int gu;
 8 ll n,k,ans;
 9 
10 int main()
11 {
12     scanf("%lld%lld",&n,&k);
13     ans=n*k;
14     for(int x=1;x<=n;x=gu+1)
15     {
16         gu=k/x ? min(k/(k/x),n) : n;
17         ans-=(k/x)*(x+gu)*(gu-x+1)>>1;
18     }
19     printf("%lld",ans);
20     return 0;
21 }
View Code

猜你喜欢

转载自www.cnblogs.com/nopartyfoucaodong/p/9704118.html