省选题竟然送了这么多分,60分直接暴力算就行。(算了,07年的省选)
数学题嘛,通常我们需要把式子展开,然后寻找一些性质化简=w=。
展开式以及寻找规律的过程lyd老师讲的很清楚T_T,放照片了...
如果不能冷静分析,理论证明,我们还可以打表呀
发现了k/i在一定范围内是相等的后,我们就可以降低复杂度了,x是我们当前到的i(增强了效率),gu是相同值组成的块的右端点,之后我们就可以用等差数列算出sigma下标,问题得解。这也是除法分块的一个方法技巧。
细节:防止整数被0处,特判一下。
Code
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }