題目鏈接:https://codeforc.es/problemset/problem/616/E
題目大意:給定兩個數,要求計算。
思路:
==
化簡到這之後就可以用數學分塊進行求和就了。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll qpow(ll x,ll y){
ll ans=1;
while(y){
if(y&1){
ans=ans*x%mod;
}
y>>=1;
x=x*x%mod;
}
return ans;
}
ll ss(ll x,ll inv_2)
{
return x%mod*((x+1)%mod)%mod*inv_2%mod;
}
int main()
{
ll n,m;
ll inv_2=qpow(2,mod-2);
cin>>n>>m;
ll sum1=n%mod*(m%mod)%mod;//計算第一部分
ll l=1,r=1;
ll sum2=0;
ll i=1;
ll minn=min(n,m);
while(l<=minn){//分塊求和
ll tmp=n/l;
r=min(n/max(1LL,tmp),minn);//注意右邊界
sum2=(sum2+tmp%mod*(ss(r,inv_2)-ss(l-1,inv_2)+mod)%mod)%mod;//sum2計算的是第二部分
l=r+1;
}
ll ans=(sum1-sum2+mod)%mod;
cout<<ans<<endl;
return 0;
}