結果
| 問題 |
No.1019 最小格子三角形
|
| ユーザー |
maspy
|
| 提出日時 | 2020-03-26 13:57:09 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 91 ms / 2,000 ms |
| コード長 | 1,772 bytes |
| コンパイル時間 | 1,288 ms |
| コンパイル使用メモリ | 161,360 KB |
| 実行使用メモリ | 12,812 KB |
| 最終ジャッジ日時 | 2025-01-02 01:41:19 |
| 合計ジャッジ時間 | 3,474 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 1000010
const int MOD = 998244353;
bool is_prime[MAX];
ll mu[MAX];
vector<int> prime_table()
{
is_prime[2] = true;
for (int n = 3; n < MAX; n += 2)
{
is_prime[n] = true;
}
for (int p = 3; p * p < MAX; p += 2)
{
if (is_prime[p])
{
int q = p * p;
for (int i = q; i < MAX; i += p)
{
is_prime[i] = false;
}
}
}
vector<int> primes;
for (int p = 0; p < MAX; p++)
{
if (is_prime[p])
{
primes.emplace_back(p);
}
}
return primes;
}
void mobius_table(vector<int> primes)
{
for (int n = 1; n < MAX; n++)
{
mu[n] = 1;
}
for (int i = 0; i < primes.size(); i++)
{
ll p = primes[i];
for (int j = p; j < MAX; j += p)
{
mu[j] *= (-1);
}
ll q = p * p;
if (q >= MAX)
continue;
for (int j = q; j < MAX; j += q)
{
mu[j] = 0;
}
}
}
ll F(ll N)
{
ll x_max = sqrt(N);
ll S = 0;
for (ll x = 1; x <= x_max; x++)
{
ll y_max = sqrt(N - x * x);
S += x * (1 + 2 * y_max);
S %= MOD;
}
return S;
}
ll f(ll N)
{
ll ret = 0;
for (ll d = 1; d <= N; d++)
{
ll n = N / (d * d);
if(n == 0){
break;
}
ret += F(n) * mu[d] * d % MOD;
}
ret %= MOD;
ret *= 24;
ret -= 16;
ret %= MOD;
if (ret < 0)
ret += MOD;
return ret;
}
int main()
{
ll N;
cin >> N;
vector<int> primes = prime_table();
mobius_table(primes);
cout << f(N) << endl;
return 0;
}
maspy