main
黄海 2 years ago
parent 497553300a
commit 79cd3e0cc3

@ -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=510113
*/
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

Loading…
Cancel
Save