結果

問題 No.886 Direct
コンテスト
ユーザー vjudge1
提出日時 2026-04-20 21:27:28
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 362 ms / 4,000 ms
コード長 998 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 933 ms
コンパイル使用メモリ 180,468 KB
実行使用メモリ 19,456 KB
最終ジャッジ日時 2026-04-20 21:27:34
合計ジャッジ時間 4,888 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 32
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007LL
using namespace std;

int n, m, pcnt; ll ans, suma, sumb; int mu[3000009], prime[3000009]; bool notp[3000009];

int main() {
	scanf("%d %d", &n, &m);
	mu[1] = 1; for(int i = 2; i <= min(n, m); i++) {
        if(!notp[i]) mu[i] = -1, prime[++pcnt] = i;
        mu[i] = (mu[i] + mod) % mod;
        for(int j = 1; j <= pcnt && i * prime[j] <= min(n, m); j++) {
            notp[i * prime[j]] = true;
            mu[i * prime[j]] = -mu[i];
            if(i % prime[j] == 0) {
                mu[i * prime[j]] = 0;
                break;
            } 
        }
    }
    ans = ((ll)(n - 1) * m + (ll)(m - 1) * n) % mod;
    for(int i = 1; i <= min(n, m) - 1; i++) {
    	suma = 0; for(int j = i; j < n; j += i) suma = (suma + n - j) % mod;
    	sumb = 0; for(int j = i; j < m; j += i) sumb = (sumb + m - j) % mod;
    	ans = ((((suma * sumb) % mod * mu[i]) % mod * 2) % mod + ans) % mod;
	}
	printf("%lld\n", ans);
	return 0; 
} 
0