結果
| 問題 |
No.1276 3枚のカード
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2020-10-30 23:19:20 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 654 ms / 2,000 ms |
| コード長 | 2,732 bytes |
| コンパイル時間 | 1,583 ms |
| コンパイル使用メモリ | 173,220 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-22 03:01:44 |
| 合計ジャッジ時間 | 21,552 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 61 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
#define rep(i,n) for(int i=0; i<(n); i++)
template<ULL M>
struct static_modint {
ULL x;
static_modint(ULL val = 0) : x(val) {}
static_modint& operator+=(static_modint r) { x += r.x; if (x >= M) x -= M; return *this; }
static_modint operator+(static_modint r) const { static_modint res = x; return res += r; }
static_modint& operator-=(static_modint r) { x += M - r.x; if (x >= M) x -= M; return *this; }
static_modint operator-(static_modint r) const { static_modint res = x; return res -= r; }
static_modint& operator*=(static_modint r) { x = x * r.x % M; return *this; }
static_modint operator*(static_modint r) const { return static_modint(x * r.x % M); }
static_modint pow(ULL r) const {
if (r == 0) return static_modint(1);
static_modint res = pow(r / 2);
res *= res;
if (r % 2) res *= *this;
return res;
}
static_modint& operator/=(static_modint r) { *this *= r.pow(M - 2); return *this; }
static_modint operator/(static_modint r) const { return *this * (r.pow(M - 2)); }
ULL& operator*() { return x; }
const ULL& operator*() const { return x; }
bool operator==(static_modint r) const { return x == r; }
bool operator!=(static_modint r) const { return x != r; }
};
static const ULL M = 1000000007;
using MLL = static_modint<M>;
vector<ULL> NMul; // number of greater multiples
vector<ULL> RNMul; // number of integers that has just the number of greater multiples
ULL F(ULL n) {
ULL ans = 0;
for (ULL i = 1; i * i <= n; i++) {
ULL f = n / i;
if (f * f > n) ans += f - 1;
}
for (ULL i = 1; i * i <= n; i++) ans += (i - 1) * (n / i - n / (i + 1));
ans -= n - 1;
return ans;
}
int main() {
ULL N; cin >> N;
NMul = { 0 };
RNMul = {};
for (ULL i = 1; i * i <= N; i++) {
NMul.push_back(N / i - 1);
if (NMul.back() * NMul.back() <= N) NMul.pop_back();
}
for (ULL i = 0; i * i <= N; i++) {
RNMul.push_back(N / (i + 1) - N / (i + 2));
}
MLL ans = MLL(N % M) * MLL((N - 1) % M) * MLL((N - 2) % M);
for (ULL i = 1; i < NMul.size(); i++) {
MLL tmp = 0;
tmp += (NMul[i] * (NMul[i] - 1) % M);
tmp += ((N - 2) * (N - 1 - NMul[i]) % M);
MLL Fx = F(NMul[i] + 1) % M;
tmp += Fx;
ans -= tmp;
}
for (ULL i = 0; i < RNMul.size(); i++) {
MLL tmp = 0;
tmp += (i * (i - 1) % M);
tmp += ((N - 2) * (N - 1 - i) % M);
MLL Fx = F(i + 1) % M;
tmp += Fx;
tmp *= RNMul[i];
ans -= tmp;
}
cout << *ans << endl;
return 0;
}
Nachia