|
|
|
@ -25,17 +25,18 @@ signed main() {
|
|
|
|
|
#endif
|
|
|
|
|
int n, m;
|
|
|
|
|
|
|
|
|
|
int rev6 = qmi(6, mod - 2);
|
|
|
|
|
int rev2 = qmi(2, mod - 2);
|
|
|
|
|
int Six = qmi(6, mod - 2); // 因为需要用到 % 1e9+7 下6的逆元,用费马小定理+快速幂求逆元
|
|
|
|
|
int Two = qmi(2, mod - 2); // 因为需要用到 % 1e9+7 下2的逆元,用费马小定理+快速幂求逆元
|
|
|
|
|
|
|
|
|
|
while (cin >> n >> m) {
|
|
|
|
|
int res = n * (n + 1) % mod * (2 * n + 1) % mod * rev6 % mod;
|
|
|
|
|
int t = n * (n + 1) % mod * rev2 % mod;
|
|
|
|
|
// 所结果拆分为平方和公式,等差数列两部分
|
|
|
|
|
// 注意:现在求的是整体值,还没有去掉不符合条件的数字
|
|
|
|
|
int first = n * (n + 1) % mod * (2 * n + 1) % mod * Six % mod;
|
|
|
|
|
int second = n * (n + 1) % mod * Two % mod;
|
|
|
|
|
int res = (first + second) % mod;
|
|
|
|
|
|
|
|
|
|
res = (res + t) % mod;
|
|
|
|
|
|
|
|
|
|
// 质因子分解
|
|
|
|
|
t = m; // 复制出来
|
|
|
|
|
// 对m进行质因子分解
|
|
|
|
|
int t = m; // 复制出来
|
|
|
|
|
for (int i = 2; i * i <= t; i++) {
|
|
|
|
|
if (t % i == 0) {
|
|
|
|
|
p.push_back(i);
|
|
|
|
@ -51,17 +52,18 @@ signed main() {
|
|
|
|
|
例如i=3(11二进制) 表示取前两个因子,i=5(101)表示取第1个和第3个的因子
|
|
|
|
|
*/
|
|
|
|
|
for (int i = 1; i < (1 << p.size()); i++) {
|
|
|
|
|
int cnt = 0, tmp = 1;
|
|
|
|
|
int cnt = 0, s = 1;
|
|
|
|
|
for (int j = 0; j < p.size(); j++)
|
|
|
|
|
if ((i >> j) & 1) {
|
|
|
|
|
cnt++;
|
|
|
|
|
tmp *= p[j];
|
|
|
|
|
s *= p[j];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nn = n / tmp;
|
|
|
|
|
int pt = (nn) % mod * (nn + 1) % mod * (2 * nn + 1) % mod * rev6 % mod;
|
|
|
|
|
pt = pt * tmp % mod * tmp % mod;
|
|
|
|
|
pt = (pt + nn * (tmp + tmp * nn) % mod * rev2 % mod) % mod;
|
|
|
|
|
int nn = n / s;
|
|
|
|
|
int pt = (nn) % mod * (nn + 1) % mod * (2 * nn + 1) % mod * Six % mod;
|
|
|
|
|
pt = pt * s % mod * s % mod;
|
|
|
|
|
pt = (pt + nn * (s + s * nn) % mod * Two % mod) % mod;
|
|
|
|
|
|
|
|
|
|
if (cnt & 1)
|
|
|
|
|
res = (res - pt + mod) % mod;
|
|
|
|
|
else
|
|
|
|
|