結果
問題 | No.1559 Next Rational |
ユーザー |
![]() |
提出日時 | 2021-06-28 14:02:57 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,927 bytes |
コンパイル時間 | 876 ms |
コンパイル使用メモリ | 95,628 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-25 12:09:53 |
合計ジャッジ時間 | 1,607 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 15 |
ソースコード
/* -*- coding: utf-8 -*-** 1559.cc: No.1559 Next Rational - yukicoder*/#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<string>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<deque>#include<algorithm>#include<numeric>#include<utility>#include<complex>#include<functional>using namespace std;/* constant */const int MOD = 1000000007;/* typedef */typedef long long ll;typedef int vec[2];typedef vec mat[2];/* global variables */mat ma, mb;/* subroutines */inline void initvec(vec a) { memset(a, 0, sizeof(vec)); }inline void initmat(mat a) { memset(a, 0, sizeof(mat)); }inline void unitmat(mat a) {a[0][0] = a[1][1] = 1; a[0][1] = a[1][0] = 0;}inline void copymat(const mat a, mat b) {memcpy(b, a, sizeof(mat));}inline void mulmat(const mat a, const mat b, mat c) {for (int i = 0; i < 2; i++)for (int j = 0; j < 2; j++) {c[i][j] = 0;for (int k = 0; k < 2; k++)c[i][j] = (c[i][j] + (ll)a[i][k] * b[k][j] % MOD) % MOD;}}inline void powmat(const mat a, ll b, mat c) {mat s, t;copymat(a, s);unitmat(c);while (b > 0) {if (b & 1) {mulmat(c, s, t);copymat(t, c);}mulmat(s, s, t);copymat(t, s);b >>= 1;}}int powmod(int a, int n) { // a^n % MODint pm = 1;while (n > 0) {if (n & 1) pm = (ll)pm * a % MOD;a = (ll)a * a % MOD;n >>= 1;}return pm;}/* main */int main() {ll n;int a, b, k;scanf("%lld%d%d%d", &n, &a, &b, &k);int x = (((ll)a * a % MOD + (ll)b * b % MOD) % MOD + k) % MOD;int y = (ll)a * b % MOD;ma[0][0] = 0, ma[0][1] = 1;ma[1][0] = (MOD - 1), ma[1][1] = (ll)x * powmod(y, MOD - 2) % MOD;powmat(ma, n - 1, mb);int v = ((ll)mb[0][0] * a % MOD + (ll)mb[0][1] * b % MOD) % MOD;printf("%d\n", v);return 0;}