結果
| 問題 |
No.886 Direct
|
| ユーザー |
|
| 提出日時 | 2020-01-01 04:33:00 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 114 ms / 4,000 ms |
| コード長 | 1,329 bytes |
| コンパイル時間 | 289 ms |
| コンパイル使用メモリ | 38,528 KB |
| 実行使用メモリ | 27,088 KB |
| 最終ジャッジ日時 | 2024-11-21 06:24:46 |
| 合計ジャッジ時間 | 3,226 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:51:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
51 | scanf("%lld%lld", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>
#include <vector>
using namespace std;
typedef long long int ll;
#define PB push_back
constexpr int kMod = int(1E9 + 7), kN = int(3E6 + 10);
int ABS(int n) {return n >= 0 ? n : -n;}
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
ll Pow(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1) ans = ans * a % kMod;
a = a * a % kMod;
b >>= 1;
}
return ans;
}
ll Rev(ll n) {return Pow(n, kMod - 2);}
ll mu[kN];
void pre() {
mu[0] = 0;
mu[1] = 1;
vector<int> prime;
for (int i = 2; i < kN; i++) mu[i] = -3;
for (int i = 2; i < kN; i++) {
if (mu[i] == -3) {
mu[i] = -1;
prime.PB(i);
}
for (int j : prime) {
if (i * j >= kN) break;
if (i % j == 0) {
mu[i * j] = 0;
break;
}
else mu[i * j] = -mu[i];
}
}
return ;
}
int main() {
pre();
ll n, m;
ll ans = 0, l, r;
scanf("%lld%lld", &n, &m);
for (int d = 1; d < n; d++) {
l = -(((n - 1) / d) * ((n - 1) / d + 1)) / 2;
r = -(((m - 1) / d) * ((m - 1) / d + 1)) / 2;
l *= d;
r *= d;
l += n * ((n - 1) / d);
r += m * ((m - 1) / d);
l %= kMod;
r %= kMod;
ans += l * r * mu[d] % kMod;
}
ans = ans * 2 % kMod;
if (ans < 0) ans += kMod;
ans += (n - 1) * m % kMod + (m - 1) * n % kMod;
ans %= kMod;
printf("%lld\n", ans);
}