Dreamoon loves summing up something for no reason. One day he obtains two integers a and b occasionally. He wants to calculate the sum of all nice integers. Positive integer x is called nice if and
, where k is some integer number in range[1, a].
By we denote the quotient of integer division of x and y. By
we denote the remainder of integer division of x andy. You can read more about these operations here: http://goo.gl/AcsXhT.
The answer may be large, so please print its remainder modulo 1 000 000 007 (109 + 7). Can you compute it faster than Dreamoon?
The single line of the input contains two integers a, b (1 ≤ a, b ≤ 107).
Print a single integer representing the answer modulo 1 000 000 007 (109 + 7).
1 1
0
2 2
8
For the first sample, there are no nice integers because is always zero.
For the second sample, the set of nice integers is {3, 5}.
题目意思:http://codeforces.com/contest/476/problem/C
求x满足 1<= (x/b)/(x%b) <= a && (x/b)%(x%b) ==0的x的和。
分析:把题目意思要去写成上述式子,不难得到 x = k*m + m 1<=k<=a 1<=m<=b-1
所以ans = sum_m(1,b-1) sum_k(1,a) (k*m+m )
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d\n",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define op operator
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 1010
#define MOD 1000000007
using namespace std;
LL ans;
int main(){
#ifdef ACBang
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
LL a,b;
while(~sf("%I64d%I64d",&a,&b)){
if(b==1)puts("0");
else{
ans=((b*(b-1)/2)%MOD);
ans*=((((a*(a+1)/2)%MOD)*b)%MOD+a)%MOD;
pf("%I64d\n",ans%MOD);
}
}
rt 0;
}