結果
| 問題 |
No.1259 スイッチ
|
| コンテスト | |
| ユーザー |
yuruhiya
|
| 提出日時 | 2020-10-17 10:43:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 2,000 ms |
| コード長 | 3,369 bytes |
| コンパイル時間 | 950 ms |
| コンパイル使用メモリ | 51,688 KB |
| 最終ジャッジ日時 | 2025-01-15 10:37:45 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 61 |
ソースコード
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize ("Ofast")
#include <cstdio>
#include <vector>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define rrep(i, n) for (int i = (n)-1; i >= 0; --i)
#define rfor(i, m, n) for (int i = (m); i >= (n); --i)
using ll = long long;
#ifdef _WIN32
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#define fwrite_unlocked _fwrite_nolock
#define fread_unlocked _fread_nolock
#endif
#if __has_include("dump.hpp")
#include "dump.hpp"
#else
#define dump(...) ((void)0)
#endif
// #define USE_FREAD
#ifdef USE_FREAD
struct Input {
static constexpr size_t MAX_SIZE = 4400019;
char buf[MAX_SIZE];
size_t i, end;
Input() {
i = 0;
end = fread_unlocked(buf, 1, MAX_SIZE, stdin);
}
inline int gc() {
if (i < end) {
return buf[i++];
} else {
return EOF;
}
}
} in;
#define gc in.gc
#else
#define gc getchar_unlocked
#endif // USE_FREAD
// #define USE_FWRITE
#ifdef USE_FWRITE
struct Output {
static constexpr size_t MAX_SIZE = 4000009;
char buf[MAX_SIZE];
size_t i = 0;
void pc(int c) {
buf[i++] = c;
}
~Output() {
fwrite_unlocked(buf, 1, i, stdout);
}
} out;
#define pc out.pc
#else
#define pc putchar_unlocked
#endif // USE_FWRITE
inline void ini(int& v) noexcept {
v = 0;
char c = gc();
bool f = false;
if (c == '-') {
f = true;
c = gc();
}
for (; '0' <= c && c <= '9'; c = gc())
v = v * 10 + (c - '0');
if (f) v = -v;
}
inline void inui(int& v) noexcept {
v = 0;
for (char c = gc(); '0' <= c && c <= '9'; c = gc())
v = v * 10 + (c - '0');
}
inline void inl(ll& v) noexcept {
v = 0;
char c = gc();
bool f = false;
if (c == '-') {
f = true;
c = gc();
}
for (; '0' <= c && c <= '9'; c = gc())
v = v * 10 + (c - '0');
if (f) v = -v;
}
inline void inul(ll& v) noexcept {
v = 0;
for (char c = gc(); '0' <= c && c <= '9'; c = gc())
v = v * 10 + (c - '0');
}
inline void ins(char* c, int n) noexcept {
while (n--) {
*c = gc();
++c;
}
}
inline void puti(int v) noexcept {
if (v < 0) pc('-'), v = -v;
char b[10];
int n = 0;
while (v)
b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--)
pc(b[n]);
}
inline void putui(int v) noexcept {
char b[10];
int n = 0;
while (v)
b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--)
pc(b[n]);
}
inline void putl(ll v) noexcept {
if (v < 0) pc('-'), v = -v;
char b[20];
int n = 0;
while (v)
b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--)
pc(b[n]);
}
inline void putul(ll v) noexcept {
char b[20];
int n = 0;
while (v)
b[n++] = '0' + v % 10, v /= 10;
if (!n) b[n++] = '0';
while (n--)
pc(b[n]);
}
// ---------------------------------------------------------------- //
constexpr ll MOD = 1000000007;
inline ll Powmod(ll a, ll n) {
ll r = 1;
while (n > 0) {
if (n & 1) r = r * a % MOD;
a = a * a % MOD;
n >>= 1;
}
return r;
}
int main() {
ll n, k, m;
inul(n);
inul(k);
inul(m);
ll acc = 1, x = 0;
FOR(i, 1, n + 1) {
if (k % i == 0) {
x = (x + acc * Powmod(n, n - i)) % MOD;
}
acc = (acc * (n - i)) % MOD;
}
if (m == 1) {
putul(x);
} else {
ll y = Powmod(n, n) - x;
if (y < 0) y += MOD;
putul(y * Powmod(n - 1, MOD - 2) % MOD);
}
pc('\n');
}
yuruhiya