题意:
,求
思路:数论分块。
有数论分块可得,
对于每一个
,有一个对应的右端点
,在这个区间
中的值都是
。
故上述
的区间可以划分为多个小区间,每个小区间
的值都相等。
故令
那么
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#include<cstdio>
#include<sstream>
#include<vector>
#include<bitset>
#include<algorithm>using namespace std;
#define read(x) scanf("%d",&x)
#define Read(x,y) scanf("%d%d",&x,&y)
#define gc(x) scanf(" %c",&x);
#define mmt(x,y) memset(x,y,sizeof x)
#define write(x) printf("%d\n",x)
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define ll long long
const int N = 100000 + 100;
const int M = 1e6 + 1005;
typedef long long LL;int main(){ll n,m;while(cin>>n>>m){ll ans = m * n;n = min(n,m);for(ll l = 1,r = 0;l <= n;l = r + 1){r = m/(m/l);if(r > n) r = n;ll tmp = m/l *(l + r)*(r - l + 1)/2;ans -= tmp;}cout<<ans<<endl;}}