結果
| 問題 |
No.1019 最小格子三角形
|
| ユーザー |
DEGwer3456
|
| 提出日時 | 2020-04-03 21:57:10 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 876 ms / 2,000 ms |
| コード長 | 1,133 bytes |
| コンパイル時間 | 513 ms |
| コンパイル使用メモリ | 52,832 KB |
| 実行使用メモリ | 59,776 KB |
| 最終ジャッジ日時 | 2024-07-03 02:34:13 |
| 合計ジャッジ時間 | 18,424 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mod = 998244353;
vector<int>yk[1010101];
bool isco[1010101];
int main()
{
for (int i = 2; i <= 1000000; i++)
{
if (isco[i])continue;
yk[i].push_back(i);
for (int j = i + i; j <= 1000000; j += i)isco[j] = true, yk[j].push_back(i);
}
ll num;
scanf("%lld", &num);
ll ans = 0;
for (ll a = 1;; a++)
{
if (a*a > num)break;
ll beg = 0, end = 1000000;
for (;;)
{
if (beg == end)break;
ll med = (beg + end + 1) / 2;
if (a*a + med*med > num)end = med - 1;
else beg = med;
}
ll b = beg;
ll s1 = 0, s2 = 0;
int t = yk[a].size();
for (int p = 0; p < (1 << t); p++)
{
bool f = false;
ll x = 1;
for (int i = 0; i < t; i++)if (p&(1 << i))x *= yk[a][i], f = !f;
ll z1 = b / x, z2 = z1*(z1 + 1) / 2 * x;
if (!f)s1 = (s1 + z1) % mod, s2 = (s2 + z2) % mod;
else s1 = (s1 + mod - z1) % mod, s2 = (s2 + mod - z2%mod) % mod;
}
//printf("%lld %lld %lld %lld %lld %d\n", a, b, s1, s2, s1*a + s2, t);
ans = (ans + s1*a + s2) % mod;
}
printf("%lld\n", (ans * 24 + 8) % mod);
}
DEGwer3456